关注

stack栈

C++ STL stack 栈 详解:以“堆栈计算器”为例

  1. 栈是什么?
    栈是一种“后进先出”的数据结构,简称 LIFO (Last In, First Out)。

生活类比:想象食堂里叠在一起的盘子。你只能从最上面拿盘子(出栈),洗好的新盘子也只能放在最上面(入栈)。你绝对不能从中间抽出一个盘子。

  1. C++ 中 stack 的基本操作
    使用栈需要包含头文件 。栈的操作非常简单,只有以下几个核心函数:
函数名功能注意事项
push(x)将元素 x 压入栈顶
pop()移除栈顶元素⚠️ 只删除,不返回值! 不能写 int a = s.pop();
top()获取栈顶元素的值⚠️ 只查看,不删除!
empty()判断栈是否为空空返回 true,非空返回 false
size()返回栈中元素个数

黄金定律:想要拿到栈顶元素并把它删掉,必须分两步走:int a = s.top(); s.pop();

  1. 结合题目:为什么这道题要用栈?
    在“堆栈计算器”这道题中,输入的数字和运算符是正序的,但计算器的要求是倒序取用(最后输入的最先计算)。

例如输入数字: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!栈完美地帮你实现了“倒序读取”的需求。

  1. 核心代码逻辑拆解
    第一步:数据入栈(装箱)
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); // 算完的结果再扔进栈里,参与下一轮计算
  1. 注意:
    pop() 的误用
int a = s1.pop(); // 编译报错!pop() 返回的是 void

一定要先 top() 赋值,再 pop() 删除。

  1. 总结
    遇到需要把最后出现的东西先处理掉的场景(如:括号匹配、表达式求值、浏览器的后退功能、撤销操作等),第一反应就应该想到 栈。熟练掌握 push、top、pop 铁三角,栈的题目就能迎刃而解。

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2501_91104204/article/details/160223520

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--