问题描述
计算逆波兰式(后缀表达式)的值
运算符仅包含"+","-","“和”/",被操作数可能是整数或其他表达式
例如:
[“2”, “1”, “+”, “3”, ""] -> ((2 + 1) * 3) -> 9↵ [“4”, “13”, “5”, “/”, “+”] -> (4 + (13 / 5)) -> 6
分析
逆波兰式简单来说就是将操作符放到数值的后面的表达式,可利用栈结构来计算波兰表达式的值
1.遇到操作数就出栈,把计算结果入栈
ps.计算结果时,stack至少2个数,否则不合法,返回0
2.遇到数字就入栈
ps.如果不是操作数,也无法转换为数字,就返回0,这里用try catch
3.结果要合法:
ps.如果遍历完成,stack的元素不止1个,说明不合法,返回0
pps.当stack元素只有一个的时候,返回结果
时间复杂度
O(n)
代码
import java.util.Stack;
public class Solution {
public int evalRPN(String[] tokens) {
int l = tokens.length;
if(l == 0)return 0;
Stack<Integer> s = new Stack<Integer>();
for(int i=0;i<l;i++){
//如果是操作数,对栈顶的两个数进行运算,将运算结果压栈
if(tokens[i].equals("+")||tokens[i].equals("-")||tokens[i].equals("*")||tokens[i].equals("/")){
if(s.size()<2)return 0;
int after = s.pop();
int before = s.pop();
if(tokens[i].equals("+"))
s.push(before+after);
else if(tokens[i].equals("-"))
s.push(before-after);
else if(tokens[i].equals("*"))
s.push(before*after);
else
s.push(before/after);
}
//不是操作数,如果能转换成整型,压栈
else{
try{
int k = Integer.parseInt(tokens[i]);
s.push(k);
}
catch(Exception e){
return 0;
}
}
}
//栈中多余一个数,说明表达式有误
if(s.size()==1)return s.peek();
return 0;
}
}