代码改变世界

逆波兰表达式

2017-08-18 12:56  猪牙哥  阅读(387)  评论(0编辑  收藏  举报

首先,我们要理解什么是逆波兰表达式?逆波兰表达式是将我们平常的运算表达式写出计算机可以理解的表达式,譬如

正常的表达式(中缀表达式)        ------>        逆波兰表达式(后缀表达式)

2+3     ------>     2 3 +

3+2*4     -------->     3 2 4 * +

(2+3)*(5-1)    -------->  2 3 + 5 1 - *

它的运行顺序是:将数字压入栈中,当遇到运算符时,取出前两位的数值,再将运算的结果压入栈中,然后接着继续下去。

下面就是我们的实例代码

public static void main(String[] args) {
        //计算(3-1)*(2+5)的结果,结果为14,则我们是正确的
        String str= " 3 1 - 2 5 + *";
        String[] split = str.trim().split(" ");
        Stack<Integer> stack=new Stack<>();
        for(String s: split){
            if(s.trim().matches("^-?\\d+$")){//判断是否是整数
                stack.push(Integer.valueOf(s));
            }else if(s.trim().equals("+")){
                Integer v1 = stack.pop();
                Integer v2 = stack.pop();
                stack.push(v2+v1);
            }else if(s.trim().equals("-")){
                Integer v1 = stack.pop();
                Integer v2 = stack.pop();
                stack.push(v2-v1);
            }else if(s.trim().equals("*")){
                Integer v1 = stack.pop();
                Integer v2 = stack.pop();
                stack.push(v2*v1);
            }else if(s.trim().equals("/")){
                Integer v1 = stack.pop();
                Integer v2 = stack.pop();
                stack.push(v2/v1);
            }else{
                System.out.println("非法字符");
            }
        }
        System.out.println("运算结果:"+stack.pop());
    }

运行结果:

这样子虽然电脑能够理解了并且运算出结果,但是这不是我们想要的,我们还是想输入我们平常的表达式,那么我们又如何将正常的表达式转成逆波兰表达式呢?下一遍我们将会讲到,中缀表达式转为后缀表达式。