https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
class Solution {
public int evalRPN(String[] tokens) {
Set<String> set = new HashSet<>();
Deque<String> stack = new LinkedList<>();
set.add("+");
set.add("-");
set.add("*");
set.add("/");
int count = 0;
for(int i = 0; i < tokens.length; i++) {
if(count >= 2){
if(set.contains(tokens[i])){
int later = Integer.parseInt(stack.pollLast());
int front = Integer.parseInt(stack.pollLast());
if(tokens[i].equals("+")) stack.addLast(String.valueOf(front + later));
if(tokens[i].equals("-")) stack.addLast(String.valueOf(front - later));
if(tokens[i].equals("*")) stack.addLast(String.valueOf(front * later));
if(tokens[i].equals("/")) stack.addLast(String.valueOf(front / later));
count--;
}else {
stack.addLast(tokens[i]);
count++;
}
} else {
stack.addLast(tokens[i]);
count++;
}
}
return Integer.parseInt(stack.pollLast());
}
}
由于逆波兰表达式永远有效,不用考虑特殊情况。
思路:
1.count用来记录stack中数字的个数,数字高于2个才开始判断是否是运算符,因为如果数字低于2个出现运算符,逆波兰表达式就是无效的,不存在这种情况。
2.如果出现运算符了,就进行运算,把运算结果放入栈中,count--
3.遍历数组后,栈中只会存在最终运算结果,直接返回即可。
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new LinkedList<>();
for(int i = 0; i < tokens.length; i++) {
String token = tokens[i];
if(isNumber(token)){
stack.push(Integer.parseInt(token));
} else {
int num2 = stack.pop();
int num1 = stack.pop();
switch(token) {
case "+":
stack.push(num1 + num2);
break;
case "-":
stack.push(num1 - num2);
break;
case "*":
stack.push(num1 * num2);
break;
case "/":
stack.push(num1 / num2);
break;
}
}
}
return stack.pop();
}
public boolean isNumber(String token) {
return !("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token));
}
}