根据 逆波兰表示法,求该后缀表达式的计算结果。

    有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

    说明:

    整数除法只保留整数部分。
    给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

    示例 1:

    输入:tokens = [“2”,”1”,”+”,”3”,”“]
    输出:9
    解释:该算式转化为常见的中缀算术表达式为:((2 + 1)
    3) = 9
    示例 2:

    输入:tokens = [“4”,”13”,”5”,”/“,”+”]
    输出:6
    解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
    示例 3:

    输入:tokens = [“10”,”6”,”9”,”3”,”+”,”-11”,”“,”/“,”“,”17”,”+”,”5”,”+”]
    输出:22
    解释:
    该算式转化为常见的中缀算术表达式为:
    ((10 (6 / ((9 + 3) -11))) + 17) + 5
    = ((10 (6 / (12 -11))) + 17) + 5
    = ((10 (6 / -132)) + 17) + 5
    = ((10
    0) + 17) + 5
    = (0 + 17) + 5
    = 17 + 5
    = 22

    提示:

    1 <= tokens.length <= 104
    tokens[i] 要么是一个算符(”+”、”-“、”*” 或 “/“),要么是一个在范围 [-200, 200] 内的整数

    逆波兰表达式:

    逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

    平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) ( 3 + 4 ) 。
    该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + )
    ) 。
    逆波兰表达式主要有以下两个优点:

    去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
    适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。


    1. class Solution {
    2. //基本思路:遇见数字就加进栈,遇见操作符就弹出两个数做相应的运算,注意将结果
    3. //还得加进栈
    4. public int evalRPN(String[] tokens) {
    5. Deque<Integer> stack = new ArrayDeque<Integer>();
    6. for(String s : tokens){
    7. //如果是数字或者负数就加进栈
    8. if(Character.isDigit(s.charAt(0)) || s.length() > 1){
    9. int num = 0;
    10. int n = s.length();
    11. boolean isNaga = false; //标记是否为负数
    12. for(int i = 0; i < n; ++i){
    13. if(s.charAt(i) == '-'){
    14. isNaga = true;
    15. continue;
    16. }
    17. num = num * 10 + (s.charAt(i)-'0');
    18. }
    19. if(isNaga) num = -num;
    20. stack.addLast(num);
    21. }
    22. //操作符就操作栈中元素
    23. else{
    24. int a = stack.pollLast();
    25. int b = stack.pollLast();
    26. if(s.charAt(0) == '*')
    27. a = a * b;
    28. else if(s.charAt(0) == '+')
    29. a = a + b;
    30. else if(s.charAt(0) == '-')
    31. a = b - a;
    32. else
    33. a = b / a;
    34. //将结果再加进栈
    35. stack.addLast(a);
    36. }
    37. }
    38. return stack.pollLast();
    39. }
    40. }