计算逆波兰式的值(用到栈)

问题描述
计算逆波兰式(后缀表达式)的值
运算符仅包含"+","-","“和”/",被操作数可能是整数或其他表达式
例如:
[“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;
    } 
}

你可能感兴趣的:(计算逆波兰式的值(用到栈))