【数据结构】栈的应用:表达式求值(后缀表达式)
2026/8/14 3:24:27 网站建设 项目流程

考点频率:★★★★★(栈的核心应用,选择题必考,下午题偶尔结合考查)
难度:⭐⭐⭐⭐
建议:重点掌握中缀转后缀的规则、后缀表达式的手工计算方法,这是下午题的隐性考点

1️⃣ 为什么需要后缀表达式?

你平时写的算式是(3 + 4) × 5 - 6,这叫中缀表达式——运算符在操作数中间。人看得很舒服,但计算机处理起来很麻烦,因为要考虑括号和运算符优先级。

为了让计算机更方便计算,人们设计了两种替代格式:

  • 后缀表达式(逆波兰表达式):运算符在操作数后面。例如3 4 + 5 × 6 -
  • 前缀表达式(波兰表达式):运算符在操作数前面。例如- × + 3 4 5 6

后缀表达式的最大优点不需要括号,不需要考虑优先级,按顺序扫描即可计算。

2️⃣ 中缀表达式 → 后缀表达式(手工转换方法)

2.1 方法一:加括号法(适合手工计算)

操作步骤

  1. 按运算符优先级给表达式加括号(每个运算符对应一对括号)
  2. 将每个运算符移到它对应的右括号后面
  3. 去掉所有括号

示例:将(3 + 4) × 5 - 6转为后缀表达式

第1步:加括号 ((3 + 4) × 5) - 6 ↓ 每个运算符对应一对括号: ((3 + 4) × 5) - 6 → (((3 + 4) × 5) - 6) 最内层:3 + 4 → (3 4 +) 再外层:× 5 → ((3 4 +) 5 ×) 最外层:- 6 → (((3 4 +) 5 ×) 6 -) 第2步:去掉括号 → 3 4 + 5 × 6 -

2.2 方法二:符号栈法(理解计算机是怎么做的)

中缀转后缀(计算机实现):遍历中缀表达式的每个 token(操作数或运算符),按规则处理:

  1. 操作数:直接输出到后缀表达式
  2. 左括号(:直接入栈
  3. 右括号):不断弹出栈顶运算符并输出,直到遇到左括号(左括号弹出但不输出)
  4. 运算符:当栈顶运算符的优先级 ≥ 当前运算符优先级时,弹出并输出栈顶,然后将当前运算符入栈

示例3 + 4 × 5 - 6

步骤符号输出(后缀)运算符栈说明
133操作数直接输出
2+3+栈空,直接入栈
343 4+操作数直接输出
4×3 4+ ×栈顶+优先级低于×,直接入栈
553 4 5+ ×操作数直接输出
6-3 4 5 ×+×优先级 ≥-,弹出×+优先级 ≥-,弹出+;然后-入栈
763 4 5 × 6-操作数直接输出
8结束3 4 5 × 6 -弹出栈中剩余运算符

结果3 4 5 × 6 -

3️⃣ 后缀表达式的计算

计算规则

  1. 从左到右扫描后缀表达式
  2. 遇到操作数,入栈
  3. 遇到运算符,弹出栈顶的两个操作数,计算结果后入栈
  4. 扫描结束后,栈顶就是最终结果

示例:计算3 4 5 × 6 -

步骤扫描到操作
13入栈[3]
24入栈[3, 4]
35入栈[3, 4, 5]
4×弹出 4 和 5 → 4×5=20 → 入栈[3, 20]
56入栈[3, 20, 6]
6-弹出 20 和 6 → 20-6=14 → 入栈[3, 14]
7结束弹出栈顶14

结果14(与原中缀表达式(3+4)×5-6=35-6=29不一致?等等,这里有问题!)

⚠️发现错误:上面的计算结果是 14,但原式(3+4)×5-6应该等于 29。

原因:我把运算符优先级搞反了。3 + 4 × 5 - 6正确的后缀是3 4 5 × + 6 -,而不是3 4 5 × 6 -

修正后的计算

步骤扫描到
13[3]
24[3, 4]
35[3, 4, 5]
4×[3, 20]
5+[23]
66[23, 6]
7-[17]

结果17仍然不对?等等,原式3+4×5-6按乘除优先是3+20-6=17,正确!我本来想写的是(3+4)×5-6,但写成3+4×5-6了。

所以:(3+4)×5-6对应的后缀是3 4 + 5 × 6 -,计算如下:

步骤
3[3]
4[3, 4]
+[7]
5[7, 5]
×[35]
6[35, 6]
-[29]

结果:29 ✅

4️⃣ 中缀 → 后缀 → 求值(完整例题)

题目:计算中缀表达式8 + (3 - 1) × 2

第1步:中缀 → 后缀

  • 加括号法:8 + ((3 - 1) × 2)(8 ((3 1 -) 2 ×) +)→ 去掉括号:8 3 1 - 2 × +

第2步:计算后缀8 3 1 - 2 × +

步骤扫描到
18[8]
23[8, 3]
31[8, 3, 1]
4-[8, 2]
52[8, 2, 2]
6×[8, 4]
7+[12]

结果:12 ✅

5️⃣ 运算符优先级速查

运算符优先级
( )最高(用于改变运算顺序)
×/
+-

6️⃣ 经典例题

例题1(中缀转后缀):中缀表达式a + b * c - d / e对应的后缀表达式是( )。

A.a b c * + d e / -
B.a b c * d e / - +
C.a b * c + d e / -
D.a b c * + d e - /

解析a + b × c - d / ea (b c ×) + (d e /) -a b c × + d e / -。选A


例题2(后缀求值):后缀表达式5 1 2 + 4 × + 3 -的值为( )。

解析

步骤
5[5]
1[5, 1]
2[5, 1, 2]
+[5, 3]
4[5, 3, 4]
×[5, 12]
+[17]
3[17, 3]
-[14]

答案:14

7️⃣ 记忆口诀

中缀转后缀,操作数直接写。
左括号入栈,右括号弹到底。
运算符看栈顶,同级高先弹。
后缀求值用栈,数字入栈运算符弹两数。

8️⃣ 小测验(评论区对答案)

中缀表达式(a + b) * (c - d)对应的后缀表达式是( )。
A.a b + c d - *
B.a b c d + - *
C.a b + c - d *
D.a b c + d - *

答案下期公布。

🔔本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #栈 #后缀表达式 #表达式求值 #数据结构 #软考备考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询