(c4)栈应用:中缀表达式
把双栈协作、优先级判定与括号嵌套讲到底
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
(c4)栈应用:中缀表达式
把双栈协作、优先级判定与括号嵌套讲到底
把玩
你随手写 3+5×4,脑子秒出 23。但计算机没有常识,它需要明确的规则——两个栈配合,一次扫描,按优先级结算,这就是今天要拆开的齿轮。
商品(操作数)逐个上扫码台,遇到折扣(运算符)就回头把之前没结的清掉
构思
上一页我们玩过 3+5×2、((1+2))×3 等表达式,栈都能算对。但为什么「先乘除后加减」能被一个先进后出的栈管住?这页讲构思。
重患(高优先级运算符)先抢救,轻患(低优先级)继续排队等候
实例
上一页我们搭好了双栈求值的思路。现在用 '3 + 4 × 2 - 1' 走一遍,看运算符栈和操作数栈如何配合处理优先级与结合性。
数字像车厢依次通过;运算符像调度命令压在站台,优先级决定何时执行
算法框架
上一页我们手工走了一遍 3+4×2-5 的求值。但每次都靠人脑比对优先级太麻烦——能否让机器按一套规则自动完成?这就需要把思路固化成算法框架。
一条摆零件(数字),一条排加工指令(符号);新指令优先级低时先把栈顶工序做完
算法细节
算法框架搭好了,但真正决定它跑得对不对的,是几个细节:遇到运算符时该不该入栈、什么时候弹栈算,以及怎么把「3」「14」这种连续字符识别成一个数。
VIP(高优先级)直接上车;同级别老人(先到)先坐下,新人挤(结合性决定谁让谁)
04C4−6A 实例A
04C4−6A 实例A:定义、要点与典型应用
04C4−6B 实例B
实例A 演示了最简单的「一数一符」求值。真实表达式常常不止一个运算符——实例B 用 3+4×2−1 演示多个运算符同时出现时,栈如何决定「谁先算」。
新便签放上去前先看顶上那张——顶上那张更急就先处理掉,否则压在最上面
04C4−6C 实例C
实例B只用了一道带一层括号的式子热身。真实的算式往往嵌套更深、运算符更杂。实例C挑了一道括号多层嵌套、+、−、×、÷ 齐上阵的考题,看算法在反复压栈出栈的节拍里是否还稳得住。
草稿纸中央一行行写没算完的运算(符号栈),右边列每步的中间结果(数字栈)
实例D
前面三例分别演示了基本运算、优先级、括号。今天这例 '100-50/2*3+4' 把四种运算符、两位数、混合优先级都凑齐,看算法能不能扛住真实场景的考验。
*、/ 像 VIP 插队到 +、- 前面,同级按到达先后处理
本节要点
- ✓双栈分工:操作数栈求值,运算符栈定序
- ✓优先级决定弹栈时机,括号强制内部先算
- ✓同级左结合:先弹再压同优先级算符
- ✓扫描结束清空残栈,即为算法终止信号
课后思考
先独立想 1 分钟,再看参考答案——问题比答案更有价值。
参考答案本质是「何时算」与「算什么」两条线的分离。运算符栈通过优先级和括号决定运算顺序;操作数栈存放待运算的数字。两个职责解耦,才能在遇到新运算符时正确判断该立刻计算还是先压栈等待。
参考答案属于字符串解析层的改动:扫描时跳过空格,遇到数字字符就连续拼接直到非数字,形成完整整数。栈的进出逻辑不受影响,核心算法框架照常运行。
参考答案完全适用。优先级只是「两个运算符谁先算」的一张比较表,框架(遇运算符与栈顶比较、决定弹栈或压栈)无需改动,只需替换优先级表——这正是该算法的优雅之处。