一、题目内容

image.png

二、题解

解法1:

思路

先转后缀,再计算

代码

  1. public class Solution {
  2. /**
  3. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
  4. * 返回表达式的值
  5. * @param s string字符串 待计算的表达式
  6. * @return int整型
  7. */
  8. public int solve (String s) {
  9. // write code here
  10. return eval(transToPostOrder(s));
  11. }
  12. private List<String> transToPostOrder(String s){
  13. List<String> ans = new ArrayList<String>();
  14. //优先级
  15. HashMap<String, Integer> map = new HashMap<>();
  16. map.put("+", 1);
  17. map.put("-", 1);
  18. map.put("*", 2);
  19. map.put("/", 2);
  20. Stack<String> stack = new Stack<String>();
  21. int index = 0;
  22. while (index < s.length()) {
  23. String target = "";
  24. if (!Character.isDigit(s.charAt(index))) {
  25. target = s.charAt(index) + "";
  26. index++;
  27. } else {
  28. while (index < s.length() && Character.isDigit(s.charAt(index))) {
  29. target += s.charAt(index) + "";
  30. index++;
  31. }
  32. }
  33. if (!map.containsKey(target)) {
  34. if (target.equals("(")) {
  35. stack.push(target);
  36. } else if (target.equals(")")) {
  37. while (!stack.peek().equals("(")) {
  38. ans.add(stack.pop());
  39. }
  40. stack.pop();
  41. } else {
  42. ans.add(target);
  43. }
  44. } else {
  45. if(stack.isEmpty()){
  46. stack.push(target);
  47. }else{
  48. String peek = stack.peek();
  49. while (!stack.isEmpty() && !peek.equals("(") && map.get(stack.peek()) > map.get(target)) {
  50. ans.add(stack.pop());
  51. }
  52. stack.push(target);
  53. }
  54. }
  55. }
  56. while (!stack.isEmpty()) {
  57. ans.add(stack.pop());
  58. }
  59. return ans;
  60. }
  61. private int eval(List<String> tokens){
  62. Stack<Integer> stack = new Stack<Integer>();
  63. for(String token: tokens){
  64. if(isNumber(token)){
  65. stack.push(Integer.parseInt(token));
  66. }else{
  67. Integer num2 = stack.pop();
  68. Integer num1 = stack.pop();
  69. switch (token) {
  70. case "+":
  71. stack.push(num1 + num2);
  72. break;
  73. case "-":
  74. stack.push(num1 - num2);
  75. break;
  76. case "*":
  77. stack.push(num1 * num2);
  78. break;
  79. case "/":
  80. stack.push(num1 / num2);
  81. break;
  82. default:
  83. }
  84. }
  85. }
  86. return stack.pop();
  87. }
  88. public boolean isNumber(String token) {
  89. return !("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token));
  90. }
  91. }