逆波兰式

今天跟鹏帅学习了逆波兰式的产生原理,结合百度知道上的说法,做出如下步骤总结:

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:

解法二:以中序式最后一次运算的运算符为根节点,左侧的算式为左子树,右侧为右子树,依次类推。然后以根右左的顺序遍历此树,得到的输出结果即为逆波兰式

posted on 2012-10-21 20:25  chlde2500  阅读(758)  评论(0编辑  收藏  举报

导航