栈evaluate-reverse-polish-notation-leetcode练习题

╰半夏微凉° 2023-07-23 03:45 143阅读 0赞
  1. import java.util.HashSet;
  2. import java.util.Set;
  3. import java.util.Stack;
  4. /**
  5. * 根据逆波兰表示法,求表达式的值。
  6. * <p>
  7. * 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
  8. * <p>
  9. * 说明:
  10. * <p>
  11. * 整数除法只保留整数部分。
  12. * 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
  13. * <p>
  14. * 示例 1:
  15. * <p>
  16. * 输入: ["2", "1", "+", "3", "*"]
  17. * 输出: 9
  18. * 解释: ((2 + 1) * 3) = 9
  19. * <p>
  20. * 示例 2:
  21. * <p>
  22. * 输入: ["4", "13", "5", "/", "+"]
  23. * 输出: 6
  24. * 解释: (4 + (13 / 5)) = 6
  25. * <p>
  26. * 示例 3:
  27. * <p>
  28. * 输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
  29. * 输出: 22
  30. * 解释:
  31. * ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
  32. * = ((10 * (6 / (12 * -11))) + 17) + 5
  33. * = ((10 * (6 / -132)) + 17) + 5
  34. * = ((10 * 0) + 17) + 5
  35. * = (0 + 17) + 5
  36. * = 17 + 5
  37. * = 22
  38. * <p>
  39. * 来源:力扣(LeetCode)
  40. * 链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation
  41. * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
  42. */
  43. public class Solution {
  44. private static Set<String> OPERATERS = new HashSet<>();
  45. static {
  46. OPERATERS.add("+");
  47. OPERATERS.add("-");
  48. OPERATERS.add("*");
  49. OPERATERS.add("/");
  50. }
  51. public int evalRPN(String[] tokens) {
  52. Stack<Integer> datas = new Stack();
  53. for (String character : tokens) {
  54. if (isNumber(character)) {
  55. datas.push(Integer.parseInt(character));
  56. } else {
  57. if (datas.size() >= 2) {
  58. // 取出两个值和现在的符号处理后将新的值放入栈中
  59. int num1 = datas.pop();
  60. int num2 = datas.pop();
  61. int temp = 0;
  62. if ("+".equals(character)) {
  63. temp = num2 + num1;
  64. } else if ("-".equals(character)) {
  65. temp = num2 - num1;
  66. } else if ("*".equals(character)) {
  67. temp = num2 * num1;
  68. } else {
  69. temp = num2 / num1;
  70. }
  71. datas.push(temp);
  72. } else {
  73. throw new IllegalArgumentException();
  74. }
  75. }
  76. }
  77. return datas.pop();
  78. }
  79. private boolean isNumber(String token) {
  80. if (OPERATERS.contains(token)) {
  81. return false;
  82. }
  83. return true;
  84. }
  85. public static void main(String[] args) {
  86. Solution solution = new Solution();
  87. String[] tokens = {"10", "6", "9", "3", "+", "-11", "*", "/", "*",
  88. "17", "+", "5", "+"};
  89. System.out.println(solution.evalRPN(tokens));
  90. }
  91. }

核心思想:

每次取两个数字和符号处理后再次将数字压栈

发表评论

表情:
评论列表 (有 0 条评论,143人围观)

还没有评论,来说两句吧...

相关阅读

    相关 练习题

    1. 简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型 2. Pyhton 单行注释和多行注释分别用什么? 3. 布尔值分别有什么,及作

    相关 练习题

    1、显示/var目录下所有以l开头,以一个小字母结尾,且中间出现一位数字的文件或目录;             \ ls /var/l\\[\[:digit:\]\]\[\

    相关 练习题

    题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不