逆波兰表达式就是把操作数放前面, 把操作符后置的一种写法, 第一个出现的运算符, 前面必定会由数字, 然后将这两个数字进行运算后, 将新的数字插到原位置, 继续操作, 最后可以得到答案.
用栈的思路比较简单 :
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
int res = 0;
for (String c : tokens) {
if (c.equals("+")) {
int n1 = stack.pop();
int n2 = stack.pop();
res = n1 + n2;
stack.push(res);
} else if (c.equals("-")) {
int n1 = stack.pop();
int n2 = stack.pop();
res = n2 - n1;
stack.push(res);
} else if (c.equals("*")) {
int n1 = stack.pop();
int n2 = stack.pop();
res = n1 * n2;
stack.push(res);
} else if (c.equals("/")) {
int n1 = stack.pop();
int n2 = stack.pop();
res = (int) (n2 / n1);
stack.push(res);
} else {
stack.push(Integer.parseInt(c));
}
}
return stack.pop();
}
}
在写这段代码中遇到的几个问题 :
- 开始的时候, 将 tokens 作为了一个字符串, 而不是字符串数组, 所以就需要考虑将 char 转换为 int 的方法 :
一种是先将单个的 char 转换为 string, 利用 string 转为 int : Integer.parseInt(new String(charArray));
另一种是利用 char 的包装类 character : Character.getNumbericValue(numChar) - 但是实际上 tokens 是一个 字符串数组, 这里考虑 int 转 String 和 String 转 int 的各种方法
- int 转 String
- num + ""
- String.valueOf(num)
- Integer.toString(num) - String 转 int
- Integer.parseInt(str)
- Integer.valueOf(str).intValue() - 从栈顶取出两个数字后, 进行运算, 这里, "-" 和 "/" 的两个运算数的位置是有区别的, 所以这里开始弄错了, 遇到这样先后有区别不满足交换律的数字应该注意.