- 中缀表达式:常见的运算表达式,如(3+4)×5-6
- 前缀表达式又称波兰式:运算符位于操作数之前,比如:- × + 3 4 5 6
- 后缀表达式又称逆波兰表达式:与前缀表达式相似,只是运算符位于操作数之后,如:3 4 + 5 × 6 -
中缀表达式转后缀表达式
- 从左到右扫描表达式
- 若遇到数字,输出
- 若遇到运算符时:
- 遇到“(”,直接压入栈,
- 遇到运算符,和栈顶的运算符比较优先级,
- 优先级高的话直接压入栈,
- 优先级低的话,输出栈顶元素且栈顶元素出栈,然后继续和新的栈顶元素比较优先级,直至它的优先级高于栈顶元素时,把它压入栈
- 若平级,就按先栈里的优先级高来算
- 遇到“)”,依次弹出栈顶元素并输出,直至遇到“(”后,左括号出栈
- 扫描结束后若栈中不为空依次弹出
例: 2*(9+6/3-5)+4
从左到右开始扫描
-
扫描到2,输出
此时输出串为:2
运算符栈为:NULL -
扫描到*,入栈
此时输出串为:2
运算符栈为:* -
扫描到(,入栈
此时输出串为:2
运算符栈为:*( -
扫描到 9,输出
此时输出串为:2 9
运算符栈为:*( -
扫描到 +,优先级高于 ( ,入栈
此时输出串为:2
运算符栈为:*(+ -
扫描到 6 ,输出
此时输出串为:296
运算符栈为:*(+ -
扫描到 /,优先级大于 +,入栈
此时输出串为:296
运算符栈为:*(+/ -
扫描到 3,输出
此时输出串为:2963
运算符栈为:*(+/ -
扫描到 -,优先级低于 / ,所以 / 出栈并输出,
此时输出串为:2963/
运算符栈为:*(+然后 - 和 +比较,因为+号在栈里,所以+ 出栈并输出
此时输出串为:2963/+
运算符栈为:*(因为 - 优先级高于 (,-入栈
此时输出串为:2963/+
运算符栈为:*(- -
遇到5,输出
此时输出串为:2963/+5
运算符栈为:*(- -
遇到 ) ,弹出 -并输出 ,
此时输出串为:2963/+5-
运算符栈为:*(遇到了 ( ,( 出栈
此时输出串为:2963/+5-
运算符栈为:* -
扫描到 +,优先级低于 * ,* 出栈并输出,然后+入栈
此时输出串为:2963/+5-*
运算符栈为:+ -
扫描到4,输出
此时输出串为:2963/+5-*4
运算符栈为:+ -
扫描结束,将栈中元素依次出栈输出
此时输出串为:2963/+5-*4+
运算符栈为:NULL
结果: 2*(9+6/3-5)+4的后缀表达式为 2963/+5-*4+
后缀表达式转为中缀表达式
- 从左到右扫描运算符
- 遇到第运算符时,找打紧挨着他的前面两个相邻的数字,执行运算并把它们看成一个整体的数字
- 依次类推
例: 2963/+5-*4+
- 从左到右扫描,遇到第一个运算符 /,紧挨着他的前面两个相邻的数字是6和3
执行6/3并把它们看成一个整体的数字,如下296/3 +5-*4+
- 遇到 +,紧挨着他的前面两个相邻的数字是9和6/3
执行9+6/329+6/35-*4+
- 遇到 - ,紧挨着他的前面两个相邻的数字是9+6/3和5
执行9+6/3 - 529+6/3-5*4+
- 遇到 ,紧挨着他的前面两个相邻的数字是2和9+6/3-5
执行2*(9+6/3 - 5)2*(9+6/3-5)4+
- 遇到 +,紧挨着他的前面两个相邻的数字是2*(9+6/3-5)和4
执行2*(9+6/3 - 5)+42*(9+6/3-5)+4
- 结果:2*(9+6/3-5)+4
后缀表达式求值
- 参考上面后缀转中缀,每执行一次就计算一次即可。
如上例:
执行6/3=2
执行9+2=11
执行11-5=6
执行2*6=12
执行12+4=16
结果:16