题目描述(中等难度)
我们平常用的是中缀表达式,也就是上边 Explanation 中解释的。题目中的是逆波兰式,一个好处就是只需要运算符,不需要括号,不会产生歧义。
计算法则就是,每次找到运算符位置的前两个数字,然后进行计算。
解法一
学栈的时候,应该就知道这个逆波兰式了,栈的典型应用。
遇到操作数就入栈,遇到操作符就将栈顶的两个元素弹出进行操作,将结果继续入栈即可。
public int evalRPN(String[] tokens) {
Stack<String> stack = new Stack<>();
for (String t : tokens) {
if (isOperation(t)) {
int a = stringToNumber(stack.pop());
int b = stringToNumber(stack.pop());
int ans = eval(b, a, t.charAt(0));
stack.push(ans + "");
} else {
stack.push(t);
}
}
return stringToNumber(stack.pop());
}
private int eval(int a, int b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
}
return 0;
}
private int stringToNumber(String s) {
int sign = 1;
int start = 0;
if (s.charAt(0) == '-') {
sign = -1;
start = 1;
}
int res = 0;
for (int i = start; i < s.length(); i++) {
res = res * 10 + s.charAt(i) - '0';
}
return res * sign;
}
private boolean isOperation(String t) {
return t.equals("+") || t.equals("-") || t.equals("*") || t.equals("/");
}
总
主要就是栈的应用,比较简单。