一、思路
// 总共有5个盘子,进行三次操作
// 洗盘子1001,洗盘子1002,1006未洗的盘子加入
// 剩余盘子:1006 1003 1004 1005
// n代表初始盘子堆放区中盘子的数量
// m代表接下来将会有 m 次操作。
// 1表示出栈,2表示入栈
二、知识点
1、栈
栈这种结构只能在栈顶进行插入和删除操作,而且是先进后出(先进入栈的元素离栈顶比较远,后出来),允许进行插入和删除的那一端是栈顶,与之对应的另一端是栈底。
如果一个栈不包含任何元素,这个栈被称为空栈。
在计算机领域,栈的应用也十分广泛,比如浏览器的历史回退和编写文档时的“撤销”操作。
2、栈的使用
1)创建一个栈
通过stack数据类型 栈名称这样的形式来创建一个栈
2)添加元素
push(): 进栈操作,将新的元素放入到栈中,新的元素成为栈顶元素。
3)移除元素
pop()
: 出栈操作,栈顶元素从栈中离开
4)获取栈顶元素
top()
: 获取栈顶元素,但是不会移除它
5)判断栈是否为空
empty(): 判断栈是否为空栈,如果为空栈返回true, 否则或者false
6)获取栈的长度
size(): 获取栈的长度,即栈中元素的数量
// 引入stack头文件
#include <stack>
// 创建一个int类型的栈
stack<int> st;
// 往栈中添加元素,现在栈底元素是1,栈顶元素是100
st.push(1);
st.push(10);
st.push(100);
// 移除栈顶元素100,新的栈顶元素是10
st.pop();
// 获取栈顶元素10
int topNumber = st.top();
// 如果栈为空,返回true;否则返回false
bool isEmpty = st.empty();
// 获取栈的长度(元素数量)
int stackSize = st.size();
三、代码
#include <iostream>
#include <stack>
using namespace std;
int main()
{
int n, m, opt, val, num;
// 创建一个栈
stack<int> Sta;
cin >> n;
// 将输入的盘子编号使用push操作推到栈中
while (n--)
{
cin >> val;
Sta.push(val);
}
// 接收m,表示m次操作
cin >> m;
while (m--)
{
cin >> opt;
// 注意这里要判断是否为空,如果已经为空栈就不能再移除元素了
// 如果指令为1,并且栈不为空的话,才弹出栈顶元素
// 接收操作的指令,1表示出栈,2表示入栈
if (opt == 1 && !Sta.empty()) Sta.pop();
else
{
cin >> num;
Sta.push(num);
}
}
// 如果栈为空,表示栈中无元素,即盘子已经被洗完了
if (Sta.empty()) cout << "All the dishes have been washed." << endl;
else cout << Sta.top() << endl;
return 0;
}