逆波兰式求值 —Java

首先我们了解一下什么叫逆波兰表达式?
逆波兰式,也叫后缀表达式(即运算符写在操作数之后

: 9 3 / 

而我们日常所用的表达式都是中缀表达式,与逆波兰式是不一样的

上述的逆波兰式可能大家已经知道了,用中缀表达式表述:9 / 3

下面我们来试试稍微复杂一点的中缀式转逆波兰式吧!!!

中缀式:
 1. (2+3) / 5 
 2. 5 / (3+7) 
 3. (9+3) * 2 
 4. (10+3) * ((3+5) / 2)
逆波兰式:
 1. 2 3 + 5 /
 2. 5 3 7 + /
 3. 9 3 + 2 *
 4. 3 10 + 3 5 + 2 / *

发现没,所有的中缀式转逆波兰式其实是有优先级的,拿中缀式 (2+3) /5 来说转逆波兰式之后就是 2 3 + 5 /了,那么如果是 2+3/5 呢?

2+3/5的逆波兰式就是 2 3 5 / +

大家可以仔细想想为什么不一样?

是因为在 2+3/5这个表达式里,先运算的是3/5,而在(2+3) /5里,先运算的2+3。优先级不同所以最后的逆波兰式也是不一样的。

public class Main{
    //逆波兰表达式求值
    public static void main(String[] args) {
        String[] tokens={"10","6","9","3","+","-11","*","/","*","17","+","5","+"};
        int res=Integer.MAX_VALUE;
        for(int i=0;i<tokens.length;i++){
            int operator=isOperator(tokens[i]);
            if(operator==-1)continue;
            int num1=isNum(tokens,i);
            int num2;
            //第一次运算时,num1应与num2调换,再寻找下一位符号位更近的数字
            //例: 9 3 /  num1:9 num2:3 operator:/
            if(res==Integer.MAX_VALUE){
                num2=num1;
                num1=isNum(tokens,i);
            }else num2=res;
            if(operator==1)res=num1+num2;
            else if(operator==2)res=num1-num2;
            else if(operator==3)res=num1*num2;
            else if(operator==4)res=num1/num2;
        }
        System.out.println(res);
    }

    //判断是否为运算符
    static int isOperator(String str){
        if(str=="+")return 1;
        if(str=="-")return 2;
        if(str=="*")return 3;
        if(str=="/")return 4;
        return -1;
    }

    //返回离符号最近的数字
    static int isNum(String[] str,int index){
        while(index>=0){
            if(Character.isDigit(str[index].charAt(0))){
                int val= Integer.parseInt(str[index]);
                str[index]=".";
                return val;
            }
            index--;
        }
        return 0;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值