栈
栈这种数据结构只能在一侧(栈顶那一侧)进行插入和删除操作,而且是后进先出 LIFO(后进入栈的元素离栈顶比较近,先出来),允许进行插入和删除的那一端是栈顶,与之对应的另一端是栈底, 如果一个栈不包含任何元素,这个栈被称为空栈。
在计算机领域,栈的应用也十分广泛,比如浏览器的历史回退和编写文档时的“撤销”操作。
栈的操作
C++标准库提供了一个名为std::stack
的栈容器适配器,使用它需要引入<stack>
头文件:
#include <stack>
随后可以通过stack<数据类型> 栈名称
这样的格式来创建栈了。
stack<int> st;
栈常用的操作有如下几个:
- empty():判断栈是否为空栈,如果为空则返回
true
,否则返回false
- push():进栈操作,将新的元素放入栈中,新的元素称为栈顶元素
- pop():出栈操作,栈顶元素从栈中离开
- top():获取栈顶元素,但不会移除它
- size():获取栈的长度,即栈中元素的数量
st.push(1);
st.push(10);
st.push(100); // 现在栈底元素为1,栈顶元素为100
st.pop(); // 弹出栈顶元素,即弹出100
int topNumber = st.top(); // 获取栈顶元素10
bool isEmpty = st.empty(); // 如果为空则返回true,否则返回false
int stackSize = st.size(); // 获取栈的长度(元素数量)
代码编写
代码的基础结构:
#include <iostream>
#include <stack>
using namespace std;
int main() {
int n, val;
cin >> n;
}
定义一个栈,将输入的 n 个整数push到栈中,这表示将未洗的盘子加入盘子堆放区的顺序。
stack<int> st;
while (n--) {
cin >> val;
st.push(val);
}
接下来接收 m 和 n 个整数,表示对盘子的操作,如果数字为1,表示盘子被拿去清洗,如果数字为2,表示有新的盘子加入到待清洗区域(即入栈)
cin >> m; // 接收 m,表示 m 次操作
while (m--) {
cin >> opt; // 接收操作的指令, 1表示出栈,2表示入栈
if (opt == 1) { // 如果指令为1,将栈顶元素出栈
st.pop();
} else if (opt == 2) { // 如果指令为2,将输入的数字入栈
cin >> num;
st.push(num);
}
}
如果栈已经成为空栈,再输入1,也无法弹出栈顶元素,所以需要判断栈是否为空。
// 指令为1且栈不为空才弹出
if (opt == 1 && !st.empty()) st.pop();
当执行完全部操作后,如果没有下一个需要清洗的盘子,输出 “All the dishes have been washed.”, 如果有,则输出下一个待清洗的盘子编号。
if (st.empty()) { // 如果栈为空
cout << "All the dishes have been washed." << endl;
} else { // 栈不为空,输出下一个待清洗的盘子编号
cout << st.pop() << endl;
}
完整代码如下:
#include <iostream>
#include <stack>
using namespace std;
int main () {
int n, m, opt, val, num;
cin >> n;
stack<int> st;
while (n--) {
cin >> val;
st.push(val);
}
cin >> m;
while (m--) {
cin >> opt;
if (opt == 1 && !st.empty()) st.pop();
else {
cin >> num;
st.push(num);
}
}
if (st.empty()) cout << "All the dishes have been washed." << endl;
else cout << st.top() << endl;
}