码迷,mamicode.com
首页 > 其他好文 > 详细

逆波兰表达式

时间:2017-08-18 13:27:26      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:int   else   技术   入栈   http   理解   class   数字   print   

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

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

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());
    }

运行结果:

技术分享

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

逆波兰表达式

标签:int   else   技术   入栈   http   理解   class   数字   print   

原文地址:http://www.cnblogs.com/pig-brother/p/7363826.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!