逆波兰式Java 代码实现

把正常的表达式看做表达式的中序遍历,那么逆波兰式(Reverse Polish notation,RPN)就是该表达式的后序遍历,即将运算符放在操作数之后,波兰式则是该表达式的前序遍历。

1. 算法基本实现 

需要一个栈s1 和 一个数组 s2;

栈 s1 用来存放存储临时运算符,标志着开始 ,初始里面有一个#号,#号是最低优先级。

s2数组存储转换后的表达式。

不断从表达式中取出数据,逆波兰式生成思想如下所示:

(1)若取出的字符是数字,则分析出完整的运算数,该运算数直接添加到S2中,操作数使用&隔开。

(2)若取出的字符是运算符(+,-,*,/) 则将该运算符与S1栈栈顶元素比较;

如果该算符优先级(不包括括号运算符)大于S1栈栈顶运算符优先级,则将该运算符进S1栈,

否则,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,最后将该运算符送入S1栈。

(3)若取出的字符是“(”,则直接送入S1栈顶。

(4)若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2,此时抛弃“(”。

(5)取出 # , S1栈中所有的运算符添加到S2中。

举一个例子,一个表达式 (88+7)-9*6#,#号代表着结束,逆波兰生成过程如下所示。

读入的字符 栈 s1  数组 s2(生成的逆波兰式)
( #(  
8 #( 8
8 #( 88&
+ #(+  
7 #(+ 88&7
) # 88&7+
- #-  
9 #- 88&7+9
* #-* 88&7+9 
6 #-* 

88&7+9&6

# # 88&7+9&6*-

逆波兰式的计算比较简单,如果当前字符为数字,计算出一个运算数压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。

读入的字符 栈 
88 88
7 88 7
+ 95
9 95  9
6 95 9 6
*

95 54

- 41

最终结果 41 。

2. 代码实现

package reversePolishnotation;

import java.util.*;

/**
 * 逆波兰式代码实现
 */
public class MyRPN {
    private Stack s1;
    private String s2;
    private ArrayList number;

    public MyRPN() {
        s1 = new Stack<>();
        this.s1.push('#');
        s2 = new String("");
    }

    public boolean isOperation(char op) {
        if (op == '+' || op == '-' || op == '*' || op == '/') {
            return true;
        }
        return false;
    }

    public void makeRPN(String expression) {
        int length = expression.length();
        for (int i=0; i calculateStack = new Stack<>();
        int length = this.s2.length();
        for (int i=0; i

测试数据,((10*(6/(9-3)*11))+17)+5# , 表达式的逆波兰式为: 10&6&9&3-/11**17+5+,计算结果:132。

测试数据,1+5+6*9-9/3# , 表达式的逆波兰式为 :1&5+6&9*+9&3/-,计算结果:57。

你可能感兴趣的:(#,----逆波兰式,八,算法和一些oj题)