后缀式
|
A+B+C-D
|
A B+C+D-
|
A*B/C+D
|
A B*C/D+
|
A*(B+C*D)+E
|
A B C D * + * E +
|
(A+B)*C/(D+E-F)
|
A B + C * D E + F - /
|
A+B*C+(D*E+F)*G
|
A B C * + D E * F + G * +
|
结合上边的示例,会发现后缀式并没有描述优先级的括号,这是因为括号并不是运算符。大家在自己动手做两个,就掌握这种方法了。
程序中如何实现这种转换呢?那就要依靠强大的栈了。
中追到后缀的转换
当读到一个操作数时,立即把它放到输出中,即显示出来。操作符不立即输出,从而必须先存在某个地方,例如栈或变量。当遇到一个左括号时也把它放入栈中。计算是从一个初始化为空的栈开始。
如果栈为空,则将符号入栈。
如果遇见一个右括号,那么就将栈元素弹出并输出,直到遇到一个(相对应的)左括号,但是这个左括号只弹出,并不输出。
如果遇见优先级与栈首元素相同或比较低的符号,则将栈的所有元素弹出并输出,直到遇见一个左括号为止,这个左括号只弹出,并不输出,最后,将遇到的那个符号入栈。
如果遇见优先级与栈首元素高的符号(右括号除外),则把它入栈。
如果遇见右括号,则弹出并输出所有元素,直到遇到一个与之相对应的左括号,这个左括号只弹出不输出。
如果读到末尾了,则将栈中元素弹出并输出,直到栈为空,左括号只弹出不显示