( 压栈;) 弹出直到 ((不输出);运算符优先级 > 栈顶则压、≤ 则弹出继续比较。后缀求值用操作数栈,遇运算符弹两个算完压回(先弹出的是右操作数)。表达式求值是栈的经典应用。通过运算符栈和操作数栈,可以实现中缀表达式的求值,也可以将中缀表达式转换为后缀(逆波兰)表达式。
| 类型 | 又名 | 运算符位置 | 示例 |
|---|---|---|---|
| 前缀表达式 | 波兰表达式 | 操作数前 | + A B |
| 中缀表达式 | 常规表达式 | 操作数之间 | A + B |
| 后缀表达式 | 逆波兰表达式 | 操作数后 | A B + |
| 优先级 | 运算符 | 结合性 |
|---|---|---|
| 1(最低) | + - | 左结合 |
| 2 | * / % | 左结合 |
| 3 | ^ | 右结合 |
| 4(最高) | ( | — |
(:压入运算符栈):弹出栈中运算符并输出,直到遇到 ((( 弹出但不输出)(,直接压栈将 $A + B * (C - D) - E / F$ 转为后缀。
| 步骤 | 当前 | 操作 | 运算符栈 | 输出(后缀) |
|---|---|---|---|---|
| 1 | A | 输出 | A | |
| 2 | + | 压栈 | + | A |
| 3 | B | 输出 | + | A B |
| 4 | * | 压栈(优先级>+) | + * | A B |
| 5 | ( | 压栈 | + * ( | A B |
| 6 | C | 输出 | + * ( | A B C |
| 7 | - | 压栈(栈顶是() | + * ( - | A B C |
| 8 | D | 输出 | + * ( - | A B C D |
| 9 | ) | 弹出直到( | + * | A B C D - |
| 10 | - | 弹出*、弹出+、压入- | - | A B C D - * + |
| 11 | E | 输出 | - | A B C D - * + E |
| 12 | / | 压栈(优先级>-) | - / | A B C D - * + E |
| 13 | F | 输出 | - / | A B C D - * + E F |
| 结束 | 弹出所有 | A B C D - * + E F / - |
后缀表达式:A B C D - * + E F / -
计算 6 5 2 3 + 8 * + 3 + *:
6→[6] 5→[6,5] 2→[6,5,2] 3→[6,5,2,3]
+ → 2+3=5 → [6,5,5]
8 → [6,5,5,8]
* → 5*8=40 → [6,5,40]
+ → 5+40=45 → [6,45]
3 → [6,45,3]
+ → 45+3=48 → [6,48]
* → 6*48=288 → [288]
结果:288
计算 - + 2 * 3 4 / 8 2(从右往左扫描):
2→[2] 8→[2,8]
/ → 8/2=4 → [4]
4→[4,4] 3→[4,4,3]
* → 3*4=12 → [4,12]
2→[4,12,2]
+ → 2+12=14 → [4,14]
- → 14-4=10 → [10] ← 结果 10
结果:10(注意:前缀从右往左扫描,栈顶为右操作数)
将 (A+B)*C-D/(E+F) 转为后缀:
A B + C * D E F + / -+ 遇到 + 也要弹出。( 直接压栈,) 弹出直到遇到 (,( 弹出但不输出。+ 遇 + 也要弹出);后缀求值先弹出的是右操作数。↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。