栈(Stack)
1. 栈的基本概念
栈(Stack)是一种线性存储结构。生活中的一个例子如一盘碟子。
- 栈中的数据元素遵守”先进后出”(First In Last Out)的原则,简称FILO结构。
- 只能在栈顶进行插入(push,入栈,也叫压栈)和删除(pop,出栈,也叫弹栈)操作。
- 允许元素插入与删除的一端称为栈顶(top),另一端称为栈底。
栈的表示如下:
1.1 入栈(push)示例
原来栈中有A、B、C、D四个数据元素,D在栈顶,现在需要插入一个新的数据E。
1.2 出栈(pop)示例
原来栈中有A、B、C、D、E四个数据元素,现在需要删除栈顶的元素E。
2. 代码示例
C++标准库中提供了stack容器类,可以直接使用。主要函数如下:
- top():返回一个栈顶元素的引用。
- push(const T& obj):可以将对象副本压入栈顶。
- pop():弹出栈顶元素。
- size():返回栈中元素的个数。
- empty():在栈中没有元素的情况下返回 true。
使用示例如下。
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack<int> stack1; //empty stack of integer type
stack1.push(100);
stack1.push(200);
stack1.push(300);
stack1.push(400);
stack1.push(500);
stack1.pop();
stack1.pop();
stack1.push(600);
while (!stack1.empty())
{
cout << stack1.top() << " ";
stack1.pop();
}
}
输出结果为:600 300 200 100
3. 作业
【NOIP 2018 普及组初赛 q15】下图中所使用的数据结构是( )。
A. 哈希表 B. 栈 C. 队列 D. 二叉树
【CSP 2020 提高组第一轮 q04】今有一空栈 S,对下列待进栈的数据元素序列a,b,c,d,e,f依次进行:进栈,进栈,出栈,进栈,进栈,出栈的操作,则此操作完成后,栈底元素为( )。
A. b B. a C. d D. c
【NOIP 2017 普及组初赛 q16】对于入栈顺序为 a, b, c, d, e, f, g 的序列,下列( )不可能是合法的出栈序列。
A. a, b, c, d, e, f, g B. a, d, c, b, e, g, f
C. a, d, b, c, g, f, e D. g, f, e, d, c, b, a
【NOIP 2017 普及组初赛 q13】向一个栈顶指针为 hs 的链式栈中插入一个指针 s 指向的结点时,应执行( )。
A. hs->next = s;
B. s->next = hs; hs = s;
C. s->next = hs->next; hs->next = s;
D. s->next = hs; hs = hs->next;
【NOIP 2015 普及组初赛 q15】今有一空栈 S,对下列待进栈的数据元素序列 a,b,c,d,e,f 依次进行进栈,进栈,出栈,进栈, 进栈,出栈的操作,则此操作完成后,栈 S 的栈顶元素为:
A. f B. c C. a D. b
【NOIP 2012 普及组初赛 q12】如果一个栈初始时为空,且当前栈中的元素从栈底到栈顶依次为a,b,c,另有元素d已经出栈,则可能的入栈顺序是( )。
A. a, d, c, b B. b, a, c, d
C. a, c, b, d D. d, a, b, c
【NOIP 2010 普及组初赛 q15】元素R1、R2、R3、R4、R5入栈的顺序为R1、R2、R3、R4、R5。如果第1个出栈的是R3,那么第5个出栈的不可能是( )。
A. R1 B. R2 C. R4 D. R5
8、设栈最大长度为3,入栈序列为1、2、3、4、5、6,则不可能的出栈序列是( )。
A)1、2、3、4、5、6 B)2、1、3、4、5、6
C)3、4、2、1、5、6 D)4、3、2、1、5、6
9、设TOP为链栈的栈顶指针,则空栈的条件是( )。
A)n==0 B)TOP->next==0 C)TOP==NULL D)TOP->next==NULL
10、有5个元素,其入栈次序为:A、B、C、D、E,在各种可能的出栈次序中,以元素C第一个出栈,D第二个出栈的次序有哪几个?
11、设栈的输入序列是1,2,…,n,若输出序列的第一个元素是n,则第i个输出元素是( )。
A)n-i+1 B)i C)n-i D)前面都不正确
12、栈应用的典型事例是( )。
A)排队 B)查找 C)归并 D)用“算符优先法”进行表达式求值
13、一般情况下,将递归算法转换成等价的非递归算法应该设置( )。
A)栈 B)队列 C)堆栈或队列 D)数组