150. 逆波兰表达式求值中出现的错误(.equals引发的血案)

150. 逆波兰表达式求值

名词解释:逆波兰式也称为后缀表达式。

思路:题目要求的是既可以把中途运算的结果转化为表达式也可以转化为整数结果,我是直接转化为整数结果,思路很简单,循环遍历字符串,遇到数字字符直接压入栈,如遇到运算符,则把栈顶的两个数字弹出,记作(第一个)a , (第二个)b,根据转化为中缀表达式的最终算数表达式来看(不会的可以先学后缀表达式转中缀表达式)是 b(运算符)a然后把结果压入栈,直到循环结束得出结果。

源码献上:

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<String> result = new Stack<>();
        Integer a = 0, b = 0, c = 0;
        for(int i = 0; i < tokens.length;i++){
            if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/"){
                a = Integer.valueOf(result.pop());
                b = Integer.valueOf(result.pop());
                if(tokens[i] == "+")  c = b + a;
                if(tokens[i] == "-")  c = b - a;
                if(tokens[i] == "*")  c = b * a;
                if(tokens[i] == "/")  c = b / a;
                result.push(Integer.toString(c));
            }else result.push(tokens[i]);
        }
        return Integer.valueOf(result.pop());
    }
}

出现的问题:

这个是在力扣编译器执行报的错,下面是我在本地idea上运行的结果

并没有出现问题,甚至还得出了结果,这就奇怪了。

分析报错:

NumberFormatException:数字格式异常,报错说的是对于输入字符串*出现了数字格式异常,上网搜了下大家关于NumberFormatException异常报错的分析,查出说的是对于不是纯数字的字符串用Integer.valueOf()进行转换会报NumberFormatException异常,但是很奇怪因为我进行转换时,转换的正是最终得出结果的纯数字字符串啊,并没有包含其他空格或者是非数字字符串,试了下在终端输入其他的测试用例,报错为

第一个测试用例是:tokens = ["2","1","+","3","*"]

第二个测试用例是:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]

好家伙这报错的不是tokens的最后一个字符串,检查一下代码,好家伙判断字符串是否相等居然用了==,真像给自己一个大臂兜,改成.equals

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<String> result = new Stack<>();
        Integer a = 0, b = 0, c = 0;
        for(int i = 0; i < tokens.length;i++){
            if(tokens[i].equals("+") || tokens[i].equals("-") || tokens[i].equals("*") || tokens[i].equals("/")){
                a = Integer.valueOf(result.pop());
                b = Integer.valueOf(result.pop());
                if(tokens[i].equals("+"))  c = b + a;
                if(tokens[i].equals("-"))  c = b - a;
                if(tokens[i].equals("*"))  c = b * a;
                if(tokens[i].equals("/"))  c = b / a;
                result.push(Integer.toString(c));
            }else result.push(tokens[i]);
        }
        return Integer.valueOf(result.pop());
    }
}

最后得出结果:

展示下测试结果吧,菜鸟一枚,最后警醒自己注意细节~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值