/*
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are+,-,*,/. Each operand may be an integer or another expression.
*/
public int evalRPN(String[] tokens) {
//双向队列,既可以FIFO也可以LIFO,即队列和栈
Deque<Integer> deque = new ArrayDeque<>();
int num1, num2;// 临时存放栈中弹出两个元素
/**
* 遍历初始字符串数组,
* 若当前字符为 运算符 ,则从栈中弹出两个元素,并用该运算符对它们进行运算,然后再将运算结果
* 压入栈若读到的是数字,则直接将其压入栈,不作其他操作
*/
for (int i = 0; i < tokens.length; i++) {
String temp = tokens[i];
switch(temp) {
case "+":
num1 = deque.pop();
num2 = deque.pop();
deque.push((num2 + num1));
break;
case "-":
num1 = deque.pop();
num2 = deque.pop();
deque.push(num2 - num1);
break;
case "*":
num1 = deque.pop();
num2 = deque.pop();
deque.push(num2 * num1);
break;
case "/":
num1 = deque.pop();
num2 = deque.pop();
if (num1 == 0) {
return -1;
}
deque.push(num2 / num1);
break;
default:
deque.push(Integer.parseInt(temp));
break;
}
}
int result = deque.peek();
return result;
}
@Test
public void test() {
//String[] aa = new String[]{"2", "1", "+", "3", "*"};
String[] aa = new String[]{"4", "13", "5", "/", "+"};
System.out.println(evalRPN(aa));
}