逆波兰式
今天跟鹏帅学习了逆波兰式的产生原理,结合百度知道上的说法,做出如下步骤总结:
1.初始化两个栈,S1和S2。S1用来临时存放运算符,S2用来存放字母和运算符。
2.确定个运算符的优先级。右括号“)”优先级最高,当它出现时,要将“()”中所有的运算符弹出,并送入S2中。但注意的是,此过程中,“()”将不送入S2中。其他的运算符的优先级与正常运算中的优先级一样,既乘除最高,加减次之。最后再S1的栈底有一个“#”,作为算式的终止符,其优先级最低。当它弹出时,整个算式输出结束。
3.开始运算。将一个中序表达式,由左至右依次完成如下动作:
(1)遇到运算符,若此运算符的优先级大于等于(>=)S1的栈顶运算符的优先级,则将其入栈S1。否则,将S1的栈顶弹出,入栈S2,直至此运算符的优先级大于等于(>=)S1的栈顶运算符的优先级为止,然后将此运算符入栈S1。
(2)遇到字母,直接入栈S2。
4.当中序表达式全部都在S1和S2中时,将S1中的符号全部入栈到S2,直至#(#仍保留在S1中)。
5.将S2顺序入栈到S1中,此时S1中的顺序即为该中序表达式的后缀表达式既逆波兰式。
例题:输出(a+b)*c-(a+b)/e的逆波兰式
解法一: S1:#(+ S2:ab ----> S1:# S2:ab+ ----> S1:#* S2:ab+c ----> S1:# S2:ab+c* ----> S1:#-(+ S2:ab+c*ab
----> S1:#-(+ S2:ab+c*ab ----> S1:#- S2:ab+c*ab+ ----> S1:#-/ S2:ab+c*ab+e ----> S1:# S2:ab+c*ab+e/-
----> S1:#-/e+ba*c+ba S2:
解法二:以中序式最后一次运算的运算符为根节点,左侧的算式为左子树,右侧为右子树,依次类推。然后以根右左的顺序遍历此树,得到的输出结果即为逆波兰式