Lc150_逆波兰表达式求值

 1import java.util.Stack;
2
3/**
4 * 150. 逆波兰表达式求值
5 * 根据 逆波兰表示法,求表达式的值。
6 * <p>
7 * 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
8 * <p>
9 * <p>
10 * <p>
11 * 说明:
12 * <p>
13 * 整数除法只保留整数部分。
14 * 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
15 * <p>
16 * <p>
17 * 示例 1:
18 * <p>
19 * 输入: ["2", "1", "+", "3", "*"]
20 * 输出: 9
21 * 解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
22 * 示例 2:
23 * <p>
24 * 输入: ["4", "13", "5", "/", "+"]
25 * 输出: 6
26 * 解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
27 * 示例 3:
28 * <p>
29 * 输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
30 * 输出: 22
31 * 解释:
32 * 该算式转化为常见的中缀算术表达式为:
33 * ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
34 * = ((10 * (6 / (12 * -11))) + 17) + 5
35 * = ((10 * (6 / -132)) + 17) + 5
36 * = ((10 * 0) + 17) + 5
37 * = (0 + 17) + 5
38 * = 17 + 5
39 * = 22
40 * <p>
41 * <p>
42 * 逆波兰表达式:
43 * <p>
44 * 逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
45 * <p>
46 * 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
47 * 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
48 * 逆波兰表达式主要有以下两个优点:
49 * <p>
50 * 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
51 * 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。
52 * 通过次数72,706提交次数142,047
53 */

54public class EvalRPN {
55    /**
56     * 这道题俩种思路
57     * 第一种二叉树后序遍历
58     * 第二种栈,利用后续遍历的的思路 避开优先级考虑
59     * 注意栈是先进后出,所以取值后要反着用
60     *
61     * @param tokens
62     * @return
63     */

64    public static int evalRPN(String[] tokens) {
65        Stack<Integer> stack = new Stack<>();
66        for (int i = 0; i < tokens.length; i++) {
67            if (tokens[i].equals("+") || tokens[i].equals("-") || tokens[i].equals("*") || tokens[i].equals("/")) {
68                int sum2 = stack.pop();
69                int sum1 = stack.pop();
70                if (tokens[i].equals("+")) {
71                    stack.push(sum1 + sum2);
72                } else if (tokens[i].equals("-")) {
73                    stack.push(sum1 - sum2);
74                } else if (tokens[i].equals("*")) {
75                    stack.push(sum1 * sum2);
76                } else if (tokens[i].equals("/")) {
77                    stack.push(sum1 / sum2);
78                }
79            } else {
80                stack.push(Integer.valueOf(tokens[i]));
81            }
82        }
83        return Integer.valueOf(stack.pop());
84    }
85
86    public static void main(String[] args) {
87        String[] tokens = {"4""13""5""/""+"};
88        System.out.println(evalRPN(tokens));
89    }
90}
posted @ 2021-03-09 10:04  小傻孩丶儿  阅读(63)  评论(0编辑  收藏  举报