思路
150. 逆波兰表达式求值
使用leetcode做的第一题,借助栈来解决问题,思路如下:
使用双端队列来表示栈:Deque stack = new LinkedList<>();遍历数组,使用switch语句对数组中的每一个字符进行判断,遇到数字就压入栈,遇到运算符就把栈中的二个数组弹出并进行相应运算,然后把结果再入栈,直到数组遍历完,输出栈中最后的数字,这就是结果。
此外还有另外一种思路:用数组来模拟栈
注意
加法和乘法没有顺序,减法和除需要注意先后问题
代码:
方法一:使用栈
//运行时间:7 ms 内存消耗:38.3 MB
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new LinkedList<>();
for(String token : tokens){
switch(token){
case "+":
stack.push(stack.pop() + stack.pop());
break;
case "-":
stack.push(-stack.pop() + stack.pop());
break;
case "*":
stack.push(stack.pop() * stack.pop());
break;
case "/":
Integer temp = stack.pop();
stack.push(stack.pop()/temp);
break;
default:
stack.push(Integer.parseInt(token));
break;
}
}
return stack.pop();
}
}
方法二:使用数组模拟栈
//运行时间:3 ms 内存消耗:38.5 MB
class Solution {
//纯数组模拟栈实现(推荐)
public static int evalRPN(String[] tokens) {
int[] numStack = new int[tokens.length / 2 + 1];
int index = 0;
for (String s : tokens) {
switch (s) {
case "+":
numStack[index - 2] += numStack[--index];
break;
case "-":
numStack[index - 2] -= numStack[--index];
break;
case "*":
numStack[index - 2] *= numStack[--index];
break;
case "/":
numStack[index - 2] /= numStack[--index];
break;
default:
// numStack[index++] = Integer.valueOf(s);
//valueOf改为parseInt,减少自动拆箱装箱操作
numStack[index++] = Integer.parseInt(s);
break;
}
}
return numStack[0];
}
}