文章摘自知乎
示例表达式:[(A+B)*C]-[E-F]
转化为前缀表达式:
先计算A+B,转化为+AB
+AB作为整体与C运算,转化为*+ABC
运算E-F,转化为-EF
将*+ABC与E-F都作为整体执行-运算,转化为-*+ABC-EF
转化为后缀表达式:
先计算A+B,转化为AB+
AB+作为整体与C运算,转化为AB+C*
运算E-F,转化为EF-
将AB+C与EF-作为整体执行-运算,转化为AB+CEF–
用栈实现中缀表达式转化为后缀表达式
算法思想
如果检测到数字,则直接加入到后缀表达式中
如果检测到运算符时:
若为‘(’,入栈
若为‘)’,则依次将栈中的运算符加入后缀表达式,直到出现‘(’,并从栈中删除‘(’
若为‘+’,‘-’,‘*’,‘/’
栈空,入栈
栈顶元素为‘(’,入栈
高于栈顶元素优先级,入栈
否则,依次弹出栈顶运算符,直到一个优先级比它低的运算符或‘(’为止
遍历完成,若栈非空,依次弹出栈中所有元素
该算法使得栈顶运算符处于较高优先级,并先弹出栈,进入后缀表达式
过程分析
示例:((A+B)*C)-(E-F)
1.连续两个’(’,入栈
(当前后缀表达式: )
前缀表达式遍历进度((
2.遍历到数字A,加入到后缀表达式
(当前后缀表达式:A)
前缀表达式遍历进度((A
3.遍历到运算符+,由于栈顶元素为‘(’,直接入栈。
(当前后缀表达式:A)
4.接着遍历数字B,加入到后缀表达式
(当前后缀表达式:AB)
前缀表达式遍历进度((A+B
5.遍历‘)’,依次将栈中的运算符加入后缀表达式,直到出现‘(’,并删除栈顶的‘(’
(当前后缀表达式:AB+)
注:括号是不会出现在后缀表达式或前缀表达式中的
前缀表达式遍历进度((A+B)
6.遍历到*,栈顶为‘(’,直接入栈
7.接着遍历数字C,直接加入到后缀表达式中
(当前后缀表达式:AB+C)
前缀表达式遍历进度((A+B)*C
8.继续遍历到‘)’,依次将栈中的运算符加入后缀表达式,直到出现‘(’,并删除栈顶的‘(’
【当前后缀表达式:AB+C*】
前缀表达式遍历进度((A+B)*C)
9.接着遍历到-,栈空,入栈
【当前后缀表达式:AB+C*】
前缀表达式遍历进度((A+B)*C)-
10.遍历‘(’,直接入栈
【当前后缀表达式:AB+C*】
前缀表达式遍历进度((A+B)*C)-(
11.遍历到数字E,直接加入到后缀表达式
【当前后缀表达式:AB+C*E】
12.遍历到-,栈顶元素为‘(’,入栈
【当前后缀表达式:AB+C*E】
13.遍历到F,加入到后缀表达式
【当前后缀表达式:AB+C*EF】
前缀表达式遍历进度((A+B)*C)-(E-F
14.遍历到‘)’,依次将栈中的运算符加入后缀表达式,直到出现‘(’,并删除栈顶的‘(’
【当前后缀表达式:AB+C*EF-】
前缀表达式遍历进度((A+B)*C)-(E-F)遍历完毕
15.遍历完毕,栈非空,将栈中元素依次弹出
【当前后缀表达式:AB+C*EF–】
成功得到后缀表达式!!!
原文链接:半颗糖逗的知乎文章