C++ STL stack 栈 详解:以“堆栈计算器”为例
- 栈是什么?
栈是一种“后进先出”的数据结构,简称 LIFO (Last In, First Out)。
生活类比:想象食堂里叠在一起的盘子。你只能从最上面拿盘子(出栈),洗好的新盘子也只能放在最上面(入栈)。你绝对不能从中间抽出一个盘子。
- C++ 中 stack 的基本操作
使用栈需要包含头文件 。栈的操作非常简单,只有以下几个核心函数:
| 函数名 | 功能 | 注意事项 |
|---|---|---|
push(x) | 将元素 x 压入栈顶 | 无 |
pop() | 移除栈顶元素 | ⚠️ 只删除,不返回值! 不能写 int a = s.pop(); |
top() | 获取栈顶元素的值 | ⚠️ 只查看,不删除! |
empty() | 判断栈是否为空 | 空返回 true,非空返回 false |
size() | 返回栈中元素个数 | 无 |
黄金定律:想要拿到栈顶元素并把它删掉,必须分两步走:int a = s.top(); s.pop();
- 结合题目:为什么这道题要用栈?
在“堆栈计算器”这道题中,输入的数字和运算符是正序的,但计算器的要求是倒序取用(最后输入的最先计算)。
例如输入数字:40 5 8 3 2
如果你用普通数组存:arr[0]=40, arr[1]=5 … arr[4]=2,你要计算得从后往前找。
如果你用 stack 存:
s1.push(40); s1.push(5); s1.push(8); s1.push(3); s1.push(2);
此时栈内的状态(从底到顶)是:[40, 5, 8, 3, 2]
当你调用 s1.top() 时,直接拿到的就是 2!栈完美地帮你实现了“倒序读取”的需求。
- 核心代码逻辑拆解
第一步:数据入栈(装箱)
for(int i=0; i<n; i++){
int num; cin >> num;
s1.push(num); // 新数字永远放在最上面
}
第二步:弹栈与计算(拆箱运算)
这就是栈最精髓的地方,注意观察 n1 和 n2 弹出的顺序:
int n1 = s1.top(); s1.pop(); // 第一次弹出来的,叫 n1
int n2 = s1.top(); s1.pop(); // 第二次弹出来的,叫 n2
为什么计算公式是 n2 op n1?
因为 n1 是后压入栈的(在输入序列的右边),n2 是先压入栈的(在输入序列的左边)。弹出来之后,为了还原正常的算式顺序(左 边 右),必须写成 n2 - n1 或 n2 / n1。
第三步:结果压回栈(闭环)
s1.push(res); // 算完的结果再扔进栈里,参与下一轮计算
- 注意:
pop() 的误用
int a = s1.pop(); // 编译报错!pop() 返回的是 void
一定要先 top() 赋值,再 pop() 删除。
- 总结
遇到需要把最后出现的东西先处理掉的场景(如:括号匹配、表达式求值、浏览器的后退功能、撤销操作等),第一反应就应该想到 栈。熟练掌握 push、top、pop 铁三角,栈的题目就能迎刃而解。
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2501_91104204/article/details/160223520



