以a+bc+(de+f)*g为例,演示中缀转后缀的手算过程
由左向右遍历表达式,首先遇到a,直接将其输出。
此时输出为:a
栈的情况为:空
继续遍历,遇到+,将其放入栈中。
此时输出为:a
栈的情况为:+
继续遍历,遇到b,直接将其输出。
此时输出为:ab
栈的情况为:+
继续遍历,遇到*,因为的优先级大于栈顶的+,所以将放入栈内。
此时输出为:ab
栈的情况为:+*
继续遍历,遇到c,直接将其输出。
此时输出为:abc
栈的情况为:+*
继续遍历,遇到+,因为+的优先级低于栈顶的*,故将弹出;然后新的栈顶元素的+与这个+优先级相同,故也要弹出现在栈顶的+;然后栈空了,将现在这个+放入栈中。
此时输出为:abc+
栈的情况为:+
继续遍历,遇到(,直接将其放入栈中,不遇到)不会将(弹出。
此时输出为:abc*+
栈的情况为:+(
继续遍历,遇到d,直接将其输出。
此时输出为:abc*+d
栈的情况为:+(
继续遍历,遇到*,因为栈顶为(,不遇到)不将(弹出,故直接将放入栈中。
此时输出为:abc+d
栈的情况为:+(*
继续遍历,遇到e,直接将其输出。
此时输出为:abc*+de
栈的情况为:+(*
继续遍历,遇到+,因为+比栈顶的优先级低,故将弹出;新的栈顶元素为(,不遇到)不弹出(,故将+放入栈中。
此时输出为:abc*+de*
栈的情况为:+(+
继续遍历,遇到f,直接将其输出。
此时输出为:abc*+de*f
栈的情况为:+(+
继续遍历,遇到),直接将栈中元素依次弹出并输出直到遇到(为止,注意:(弹出但不输出。
此时输出为:abc*+de*f+
栈的情况为:+
继续遍历,遇到*,因为的优先级大于栈顶元素+的优先级,故直接将入栈。
此时输出为:abc*+def+
栈的情况为:+
继续遍历,遇到g,直接将其输出。
此时输出为:abc*+def+g
栈的情况为:+
继续遍历,为空,遍历结束。将栈内元素依次弹出。
此时输出为:abc*+def+g+
栈的情况为:空
至此,中缀表达式转后缀已经全部完成,结果为abc*+def+g+