从中序表达式 转换为 后序表达式
例题:
利用栈对表达式1+9/(8-5)*4求值的过程中,操作数栈的最大容量是多少?(B )。
A.3
B.4
C.5
D.2
操作数栈:先是+/(- , 然后遇到),则为+/ , 最后是+*
解析:
1.建立符号栈
2.顺序扫描中序表达式
a) 是数字, 直接输出
b) 是运算符
i : “(” 直接入栈
ii : “)” 将符号栈中的元素依次出栈并输出, 直到 “(”, “(“只出栈, 不输出
iii: 如果该操作符的优先级大于堆栈出口的操作符,就直接将操作符存储到堆栈中
iiii:如果该操作符的优先级不大于堆栈出口的操作符,就将堆栈出口的操作符导出(pop it), 直到该操作符的优先级大于堆栈顶端的操作符
3.扫描完后, 将栈中剩余符号依次输出
例 : 3+(2-5)*6/3
- 遇到3,是数字,直接输出
表达式:3
符号栈:
- 遇到+,栈是空的,直接将符号存储在堆栈中
表达式:3
符号栈:+
- 遇到(,直接入栈
表达式:3
符号栈:+(
- 遇到2,是数字,直接输出
表达式:32
符号栈:+(
- 遇到-,遇到的操作符是左括号"(”,就直接将该操作符输出到堆栈当中
表达式:32
符号栈:+(-
- 遇到5,是数字,直接输出
表达式:325
符号栈:+(-
- 遇到),将符号栈中的元素依次出栈并输出, 直到 “(”, “(“只出栈, 不输出
表达式:325-
符号栈:+
- 遇到*,该操作符的优先级大于堆栈出口的操作符,就直接将操作符存储到堆栈中
表达式:325-6
符号栈:+*
- 遇到6,是数字,直接输出
表达式:325-6
符号栈:+
- 遇到/,该操作符的优先级不大于堆栈出口的操作符,将堆栈出口的操作符导出, 直到该操作符的优先级大于堆栈顶端的操作符
表达式:325-6*
符号栈:+/
- 遇到3,是数字,直接输出
表达式:325-6*3
符号栈:+/
- 扫描完成,将符号栈内的符号依次输出
表达式:325-6*3/+
运用后缀表达式进行计算的具体做法:
例 : 6 5 2 3 + 8 * + 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 5 45
- 遇到3,是数字,直接入栈
栈 :6 45 3
- 遇到+,取栈顶的两个操作数,45+3=48,入栈
栈 :6 48
- 遇到*,取栈顶的两个操作数,6*48=288,入栈
栈 :288
参考:https://blog.csdn.net/u012507347/article/details/52245233