C++实现一个栈

我们先说下栈的知识,先看下我们之前写的文章

栈,C语言实现

如何自己实现一个栈

堆和栈的区别(转过无数次的文章)

这是一个栈

这是我们把数据入栈的操作

这是数据出栈的操作

之前僚机号里面发了一个用C++实现的栈文章,比较简单,基于上一次的代码再升华一下,我认为在熟悉快速写出一个栈代码,对大家在面试笔试中帮助是非常大的。

下面写了两段代码实现栈,代码不一定是完美的,肯定存在问题,但是基本思路我觉得还是可以的,有两种方法来实现,第一种是用数组来实现栈,还有一种是用指针实现。

如果在面试,面试官说让你用代码实现一个栈,因为面试的时间比较紧,而且大多数人在面试的时候可能会比较紧张,我建议用数组实现,用数组实现一个栈会简单很多,说白了有手就行,当然了,你要是可以用指针实现,而且写得比较全面,这个是加分的地方。

用数组实现的时候,我们一个元素就是一个数组的值,数组的下标可以把整个栈串联起来。

#用数组实现栈

#include <iostream>
using namespace std;class IntStack{enum {ssize = 100};int stack[ssize];int top;public:/*构造函数,初始化top变量的值*/IntStack():top(0){}/*插入数据*/void push(int i){stack[top++] = i;}/*遍历*/void TraverseStack(){cout << "---" << endl;for(int i = 0;i<top; ++i){ if(i != top -1)cout <<stack[i] << "->";elsecout <<stack[i] << endl;   } } /*弹出数据*/int pop(){return stack[--top];}
};int main()
{IntStack is;for(int i = 0; i< 20; i++){is.push(i*i);}is.TraverseStack();is.pop();is.TraverseStack();is.pop();is.TraverseStack();is.push(77);is.push(77);is.push(77);is.TraverseStack();
}

程序输出

---
0->1->4->9->16->25->36->49->64->81->100->121->144->169->196->225->256->289->324->361
---
0->1->4->9->16->25->36->49->64->81->100->121->144->169->196->225->256->289->324
---
0->1->4->9->16->25->36->49->64->81->100->121->144->169->196->225->256->289
---
0->1->4->9->16->25->36->49->64->81->100->121->144->169->196->225->256->289->77->77->77--------------------------------
Process exited after 0.03563 seconds with return value 0
请按任意键继续. . .

上图是用数组来实现的,用数组实现的栈有一个缺陷,就是栈的大小在定义数组的时候已经确定了,不能做到动态增长。

链表有点不一样,每个节点都需要有一个地址,用来保存下一个节点的地址,我们还需要一个head节点,来保存整个栈的头,这样不至于让我们的栈失去方向。

#用链表来实现一个栈

#include <iostream>
using namespace std;class Node{public:int data;Node *next;
};class Stack{/*指向栈顶的指针*/Node *top;/*栈长度*/int size; public:/*构造函数,初始化top变量的值*/Stack(){top = new Node;top->next = NULL;/*栈长度设置为0*/size = 0;cout << "Stack()"<<endl;}~Stack(){cout << "~Stack()"<<endl;Node *pTemp = top;while(top != NULL){pTemp = top;top = top->next;delete pTemp;}size = 0;}/*插入数据*/void push(int i){if(top == NULL){cout << "stack is null" << endl;return;}/*搞一个temp节点出来*/Node *temp = new Node;temp->data = i;temp->next = NULL;/*把temp节点连接到栈里面去*/if(size == 0){top = temp; } else{temp->next = top;top = temp;}size++;}/*遍历*/void TraverseStack(){if(top->next == NULL){cout << "stack is null" << endl;return;}cout << "---" << endl;Node *pTemp = top;while(pTemp != NULL){if(pTemp->next!=NULL)cout << pTemp->data <<"->";elsecout << pTemp->data <<endl;pTemp = pTemp->next;}} /*弹出数据*/int pop(){if(size == 0){cout << "stack is empty" << endl;return (0);}if(top == NULL){cout << "stack is empty" << endl;return (0);}Node *temp = top;top=top->next;cout <<"pop->data:"<< temp->data <<endl;delete temp;size--;return (0);}/*获取栈长度*/int getLength(){return size;}
};int main()
{Stack *pStack = new Stack();pStack->push(12);pStack->push(13);pStack->push(14);pStack->push(15);pStack->TraverseStack();pStack->pop();pStack->TraverseStack();pStack->pop();pStack->TraverseStack();delete pStack; 
}

程序输出

Stack()
---
15->14->13->12
pop->data:15
---
14->13->12
pop->data:14
---
13->12
~Stack()--------------------------------
Process exited after 0.03555 seconds with return value 0
请按任意键继续. . .

推荐阅读:

    专辑|Linux文章汇总

    专辑|程序人生

    专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript——文档对象模型

一、基本概念 文档对象模型&#xff08;DOM&#xff09;是表示文档和访问、操作构成文档的各种元素的应用程序接口&#xff08;API&#xff09;。它解决了NetScape的JavaScript和Microsoft的JavaScript之间的冲突&#xff0c;给web设计师和开发者一个标准的方法&#xff0c;可让…

你搞清楚「NULL」、「0」、「'0'」、「0」「\0」了吗?

我们先讨论NULL&#xff0c;平时使用指针的时候&#xff0c;会经常遇见这个家伙&#xff0c;这个家伙的值是是这样定义的#define NULL 0 或者 #define NULL (void *)0我们看一下下面这段代码#include <stdio.h>int main () {size_t ii;int *ptr NULL;unsigned long *nul…

周五跟大佬喝酒,顺便打了个球

这是前天发生的事情&#xff0c;昨天写好了文章&#xff0c;今天才发出来&#xff0c;但是名字还是想写成昨晚小聚。昨晚逍遥和啊尚过来找我打球&#xff0c;很开心&#xff0c;虽然酝酿了好久关于这次的活动&#xff0c;但是它真的发生时&#xff0c;我还是显得有些突兀和紧张…

安装Cygwin

Cygwin安装 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 下载cygwin&#xff1a;https://www.cygwin.com/ 箭头指的地方点一下就是安装该软件&#xff0c;开始要安装的一些软件&#xff0c;gcc&#xff0c;gdb&#xff0c;make&#xff0c;ssh等等。…

飞机上一般是什么操作系统?

之前波音737MAX空难失事事件牵动人心&#xff0c;让人对航空出行又平添了一份不信任&#xff0c;根据最新消息显示&#xff0c;美国联邦航空局对737 MAX机型的大量评估授权给波音公司自身进行&#xff0c;安全评估存在严重缺陷。也传出了波音737 MAX客机的培训都是通过平板电脑…

排查一个触摸屏驱动问题

今天跟同事看一个TP驱动&#xff0c;上电后日志都正常&#xff0c;但是触摸没反应&#xff0c;然后开始排查。上电后可以正常读到芯片的chip ID&#xff0c;那说明I2C是通讯正常的&#xff0c;也可以说明触摸芯片的供电也是正常的。基于这个&#xff0c;我搬来示波器&#xff0…

vmware安装ubuntu

vmware安装Ubuntu 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 &#xff08;1&#xff09; 单击”Power on this virtual machine”开始安装Ubuntu系统 经过一段时间的等待出现如下界面,单击”Install Ubuntu”进行安装 在安装的时候&#xff0…

AWS 免费套餐

https://amazonaws-china.com/cn/free/ 需要的可以看下&#xff0c;我准备搞一个RDS。 转载于:https://www.cnblogs.com/hupo376787/p/8268562.html

C++指针的应用

C指针 文章中我们介绍了指针的基本概念和应用简介。我们有提到指针可以使用在链表、队列和二叉树&#xff0c;等等。但是这些都会比较复查&#xff0c;后面"数据结构” 时&#xff0c;我们会用专门的章节来讲解这些知识。这篇文章&#xff0c;详细的探讨一下指针和其他关联…

Matplotlib——创建散点图

入门&#xff1a; 导入所用到的包 import numpy as np import matplotlib.pyplot as plt as 是对包起一个名字&#xff0c;便于后边程序的编写无颜色差别 figplt.figure() #建立一个画布 axfig.add_subplot(111) #在画布中建立图表&#xff0c;fig.add_subplot(…

vmwaretools安装

vmwaretools安装 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 vmware的作用&#xff1a;windows和linux之间文件拖文件很方便&#xff0c;但是我一般是使用samba服务器&#xff0c;后面介绍samba服务器。 &#xff08;1&#xff09;单击菜单栏上的”…

机器学习——支持向量机主要思想

概念&#xff1a;支持向量运算的分类器&#xff0c;在数据上应用基本形式的SVM分类器就可以得到低错误的结果&#xff0c;能够对训练集以外的数据点做出很好的分类决策。 名词&#xff1a; 支持向量&#xff1a;离分离超平面最近的那些点&#xff0c;需要找到最大化支持向量到分…

哇、、、、C++ 实现单向链表

之前相关的文章 C语言&#xff0c;链表 Linux内核链表 #什么是链表 链表是一种基本的数据结构&#xff0c;之前我在C语言里面写过链表的知识&#xff0c;现在延申到C&#xff0c;不管是什么语言&#xff0c;链表表示的是一种数据结构&#xff0c;跟语言没有强相关性的。 如果我…

vmware与windows共享文件夹

vmware与windows共享文件夹 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 虚拟工具安装好之后&#xff0c;我们就可以在windows和linux设置一个共享目录了,继续看图干活。 设置好共享目录以后&#xff0c;打开终端输入以下命令&#xff0c;就可以再…

asp.net如何取得纯客户端控件的值

例一&#xff1a;纯客户端控件 <input name"edisundong"type"text">在服务器端取得的方法 stringstrvalueRequest.Form.Get("edisundong");例二&#xff1a;纯客户端控件 <input type"radio"name"sex"value"…

C++ const限定符和auto类型说明符

const限定符# 1.限定常量有时我们希望定义这样的变量&#xff1a;它的值不能被改变。为了满足这一要求&#xff0c;我们使用const对变量的类型加以限定&#xff1a;const int bufSize 512;这样就把bufSize定义成了一个常量&#xff0c;它的值不能再发生变化。所以这也就意味着…

Flume框架基础

* Flume框架基础 框架简介&#xff1a; ** Flume提供一个分布式的&#xff0c;可靠的&#xff0c;对大数据量的日志进行高效收集、聚集、移动的服务&#xff0c;Flume只能在Unix环境下运行。 ** Flume基于流式架构&#xff0c;容错性强&#xff0c;也很灵活简单&#xff0c;主要…

tensorflow的安装

安装好adaconda软件&#xff0c;打开 adaconda prompt anaconda search -t conda tensorflow 查看conda create -n tensorflow python3.5 配置python3.5环境选择 yes 进行安装activate tensorflow 激活tensorflowpip install tensorflow 安装 然后打开adaco…

昨晚三巨头聚餐,顺便聊了这三个问题

今天老何找我们吃饭&#xff0c;我和老何还有老墨是邻居&#xff0c;三年前我们就认识了&#xff0c;而且关系还不错&#xff0c;但是今年疫情的原因我们都没聚过&#xff0c;上周六本来说好要聚一下&#xff0c;但又因为周末带娃的原因又没聚成&#xff0c;今天我在微信群上说…

决策树 算法原理及代码

决策树可以使用不熟悉的数据集合&#xff0c;并从中提取出一系列的规则&#xff0c;这是机器根据数据集创建规则的过程&#xff0c;就是机器学习的过程。用一个小案例分析&#xff1a;通过No surfacing 和 flippers判断该生物是否是鱼&#xff0c;No surfacing 是离开水面是否…