卡码网语言基础课 |洗盘子

卡码网语言基础课 |洗盘子

栈这种数据结构只能在一侧(栈顶那一侧)进行插入和删除操作,而且是后进先出 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值