Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +
, -
, *
, /
. Each operand may be an integer or another expression.
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
参考:
http://blog.csdn.net/soszou/article/details/37054503
思路:由于逆波兰表达式本身不需要括号来限制哪个运算该先进行,因此可以直接利用栈来模拟计算:遇到操作数直接压栈,碰到操作符直接取栈顶的2个操作数进行计算(注意第一次取出来的是右操作数),然后再把计算结果压栈,如此循环下去。最后栈中剩下的唯一一个元素便是整个表达式的值。
https://leetcode.com/problems/evaluate-reverse-polish-notation/
/**
* ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
* ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
*/
public class EvaluateReversePolishNotation {
public static void main(String[] args) {
String[] test1 = {"2", "1", "+", "3", "*"};
String[] test2 = {"4", "13", "5", "/", "+"};
System.out.println(ovalRPN(test1));
System.out.println(ovalRPN(test2));
}
public static int ovalRPN(String[] tokens) {
int returnValue = 0;
String operators = "+-*/";
Stack<String> stack = new Stack<String>();
for (String t : tokens) {
// 如果不是运算符(即如果是数字)
if (!operators.contains(t)) {
// 把数字压栈
stack.push(t);
} else { // 如果是运算符
// 把数字弹栈
// 栈中的元素为String,需转换
int a = Integer.valueOf(stack.pop());
int b = Integer.valueOf(stack.pop());
switch (t) {
case "+":
stack.push(String.valueOf(a + b));
break;
case "-":
stack.push(String.valueOf(b - a));
break;
case "*":
stack.push(String.valueOf(a * b));
break;
case "/":
stack.push(String.valueOf(b / a));
break;
}
}
}
returnValue = Integer.valueOf(stack.pop());
return returnValue;
}
}
如果JDK是1.7之前的,switch是不支持String的
注:2016/7/29 的LeetCode是可以通过的
/**
* ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
* ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
*/
/**
*
* if JDK before 1.7
*
* switch does not support String
*
*/
public class EvaluateReversePolishNotationBefore {
public static void main(String[] args) {
String[] test1 = {"2", "1", "+", "3", "*"};
String[] test2 = {"4", "13", "5", "/", "+"};
System.out.println(evalRPN(test1));
System.out.println(evalRPN(test2));
}
public static int evalRPN(String[] tokens) {
int returnValue = 0;
String operators = "+-*/";
Stack<String> stack = new Stack<String>();
for (String t : tokens) {
// 如果不是运算符(即如果是数字)
if (!operators.contains(t)) {
// 将数字压栈
stack.push(t);
} else { // 如果是运算符
// 将栈中的两个数字弹栈
// 栈中的元素为String, 需转换
// 这里注意栈是后进先出
int a = Integer.valueOf(stack.pop());
int b = Integer.valueOf(stack.pop());
// 更改的地方
int index = operators.indexOf(t);
switch (index) {
case 0:
stack.push(String.valueOf(a + b));
break;
case 1:
stack.push(String.valueOf(b - a));
break;
case 2:
stack.push(String.valueOf(a * b));
break;
case 3:
stack.push(String.valueOf(b / a));
break;
}
// switch (t) {
// case "+":
// stack.push(String.valueOf(a + b));
// break;
// case "-":
// stack.push(String.valueOf(b - a));
// break;
// case "*":
// stack.push(String.valueOf(a * b));
// break;
// case "/":
// stack.push(String.valueOf(b / a));
// break;
// }
}
}
returnValue = Integer.valueOf(stack.pop());
return returnValue;
}
}