问题分析

对所给字符串进行遍历,遇到数字字符就压入栈stack内,遇到+-*/符号就pop处栈的两个元素,进行该字符运算处理

代码实现

  1. package com.wztlink1013.problems.leetcode.editor.cn;
  2. // P150.逆波兰表达式求值
  3. // P150.evaluate-reverse-polish-notation
  4. //根据 逆波兰表示法,求表达式的值。
  5. //
  6. // 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
  7. //
  8. //
  9. //
  10. // 说明:
  11. //
  12. //
  13. // 整数除法只保留整数部分。
  14. // 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
  15. //
  16. //
  17. //
  18. //
  19. // 示例 1:
  20. //
  21. // 输入: ["2", "1", "+", "3", "*"]
  22. //输出: 9
  23. //解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
  24. //
  25. //
  26. // 示例 2:
  27. //
  28. // 输入: ["4", "13", "5", "/", "+"]
  29. //输出: 6
  30. //解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
  31. //
  32. //
  33. // 示例 3:
  34. //
  35. // 输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
  36. //输出: 22
  37. //解释:
  38. //该算式转化为常见的中缀算术表达式为:
  39. // ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
  40. //= ((10 * (6 / (12 * -11))) + 17) + 5
  41. //= ((10 * (6 / -132)) + 17) + 5
  42. //= ((10 * 0) + 17) + 5
  43. //= (0 + 17) + 5
  44. //= 17 + 5
  45. //= 22
  46. //
  47. //
  48. //
  49. // 逆波兰表达式:
  50. //
  51. // 逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
  52. //
  53. //
  54. // 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
  55. // 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
  56. //
  57. //
  58. // 逆波兰表达式主要有以下两个优点:
  59. //
  60. //
  61. // 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
  62. // 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。
  63. //
  64. // Related Topics 栈
  65. // 👍 213 👎 0
  66. import java.util.Stack;
  67. public class P150EvaluateReversePolishNotation{
  68. public static void main(String[] args) {
  69. Solution solution = new P150EvaluateReversePolishNotation().new Solution();
  70. String[] tokens_1 = {"10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"};
  71. int temp = solution.evalRPN(tokens_1);
  72. System.out.println(temp);
  73. }
  74. //leetcode submit region begin(Prohibit modification and deletion)
  75. class Solution {
  76. public int evalRPN(String[] tokens) {
  77. Stack<String> stack = new Stack<>();
  78. String temp = "0";
  79. stack.push(temp);
  80. for (String token : tokens) {
  81. int sum = 0;
  82. if (token.equals("+")) {
  83. sum += Integer.parseInt(stack.pop()) + Integer.parseInt(stack.pop());
  84. String str = String.valueOf(sum);
  85. stack.push(str);
  86. } else if (token.equals("-")) {
  87. int i = Integer.parseInt(stack.pop());
  88. int j = Integer.parseInt(stack.pop());
  89. sum += j-i;
  90. String str = String.valueOf(sum);
  91. stack.push(str);
  92. } else if (token.equals("*")) {
  93. sum += Integer.parseInt(stack.pop()) * Integer.parseInt(stack.pop());
  94. String str = String.valueOf(sum);
  95. stack.push(str);
  96. } else if (token.equals("/")) {
  97. int i = Integer.parseInt(stack.pop());
  98. int j = Integer.parseInt(stack.pop());
  99. sum += j / i;
  100. String str = String.valueOf(sum);
  101. stack.push(str);
  102. } else {
  103. stack.push(token);
  104. }
  105. }
  106. int result = Integer.parseInt(stack.pop());
  107. return result;
  108. }
  109. }
  110. //leetcode submit region end(Prohibit modification and deletion)
  111. }