基础知识:
栈stack
push( num) //入栈
pop() //栈顶元素出栈
empty() //判定栈是否为空
peek() //获取栈顶元素
search(num) //判端元素num是否在栈中,如果在返回1,不在返回-1
法一:抛出异常来解决
//1.利用stack计算,遇到操作数出栈,计算结果入栈,数字入栈,使用异常
//会报错java.lang.ArithmeticException: / by zero
import java.util.Stack;
public class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack =new Stack<Integer>();
for(int i=0;i<tokens.length;i++){
//使用异常来判断是数字还是符号,但是有点占内存。
try{
int num=Integer.parseInt(tokens[i]);
stack.add(num);
}catch(Exception e){
int a=stack.pop();
int b=stack.pop();
stack.add(get(a,b,tokens[i]));
}
}
return stack.pop();
}
public int get(int a,int b,String operator){
switch(operator){
case "+": return a+b;
case "-": return a-b;
case "*": return a*b;
case "/": return a/b;
default : return 0;
}
}
}
法二:ArrayDeque
ArrayDeque
队列、双端队列、栈的绝佳选择
使用了可变数组,所以没有容量上的限制。线程不安全,
可以作为栈来使用,效率高于Stack
作为队列来使用,效率高于LinkedList
ArrayDeque不支持null值
| 从队列首部插入 | 从队列首部取出 | 从队列尾部插入 | 从队列尾部取出
|
| 失败抛出异常(栈) | 失败返回特殊值 | 失败抛出异常 | 失败返回特殊值 |
插入 | addFirst(e) push() | offerFirst(e) | addLast(e) | offerLast(e) |
移除 | removeFirst() pop() | pollFirst() | removeLast() | pollLast() |
获取 | getFirst() | peekFirst() | getLast() | peekLast()
|
import java.util.ArrayDeque;
public class Solution {
public int evalRPN(String[] tokens) {
ArrayDeque<Integer> array =new ArrayDeque<>();
for(int i=0;i<tokens.length;i++){
int a=0,b=0;//全局变量否则报错
if(tokens[i].equals("+")||tokens[i].equals("-")||tokens[i].equals("*")|| tokens[i].equals("/")){
//先b后a,先弹出的做除数,
b =array.pollLast();
a =array.pollLast();
}
if(tokens[i].equals("+")){
array.addLast(a+b);
}else
if(tokens[i].equals("-")){
array.addLast(a-b);
}else
if(tokens[i].equals("*")){
array.addLast(a*b);
}else
if(tokens[i].equals("/")){
array.addLast(a/b);
}else{
array.addLast(Integer.valueOf(tokens[i]));
}
}
return array.pollLast();
}
}