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}