1.什么是栈?
栈(stack)和队列(queue)都是一种线性的数据结构,但访问受限。对栈来说,限定在一端来插入和删除结点,这一端称为栈顶,如下图所示,另一端称为栈底。因此,先进入栈的结点往往后出来,这就是所谓的“后进先出(LIFO, Last In, First Out)”。另外,结点的插入,称为压栈或入栈(push);结点的删除,称为出栈(pop)
日常生活中,超市存放购物车的轨道, 往往一端是靠墙,只能从另一端放和取购物车,这时这个轨道就是一个栈
2.栈有什么用?
数据结构是一个容器,是用来存放结点的。结点一般是随着数据处理的进行,逐步按顺序插入进来的,如果需要调整这些结点出去的顺序,就可能需要用到栈
考虑往栈中按顺序插入23、17、45、19这4个结点,我们可以通过调整入栈和出栈操作的顺序,得到不同的出栈结点序列。例如:
①push23; push17; pop; pop; push45; pop; push19; pop。这4个结点的出栈顺序为17,23,45,19
②push23; pop; push17; push45; pop; push19; pop; pop。这4个结点的出栈顺序为23,45,19,17
注意,栈不能做到任意调整结点的出栈顺序。例如,在上面的例子里,“45 23 17 19”这样的出栈顺序是不可能的
3.STL中的栈
要使用STL中的栈,必须包含头文件<stack>,并使用std命名空间
定义栈的方法:
stack<char> S1; //栈中的结点为字符
stack<int> S2; //栈中的结点为整型数据
stack<pos> S3; //栈中的结点为自定义结构体pos变量
stack常用的成员函数有:
①push:压栈,参数为需要压入栈的结点
②pop:出栈,返回值为出栈的结点
③top:取得栈顶结点,返回值为栈顶结点,该操作并不会弹出栈顶结点
④empty:判断栈是否为空,返回值为bool型
⑤size:返回栈中结点的个数
注意,当栈为空的时候,如果执行pop()操作,会造成Run Time Error(RTE),而且这种错误在用样例数据测试时不易发现。因此,在执行pop()操作时,可以先用empty()函数检测一下,栈不为空才执行pop()操作