名词解释:逆波兰式也称为后缀表达式。
思路:题目要求的是既可以把中途运算的结果转化为表达式也可以转化为整数结果,我是直接转化为整数结果,思路很简单,循环遍历字符串,遇到数字字符直接压入栈,如遇到运算符,则把栈顶的两个数字弹出,记作(第一个)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());
}
}
最后得出结果:
展示下测试结果吧,菜鸟一枚,最后警醒自己注意细节~