当前位置:   article > 正文

【栈与队列】给定一个中缀表达式,请编写程序计算该表达式的值。(java)_7-3 表达式求值 分数 10 作者 朱允刚 单位 吉林大学 给定一个中缀表达式,请编写程

7-3 表达式求值 分数 10 作者 朱允刚 单位 吉林大学 给定一个中缀表达式,请编写程

给定一个中缀表达式,请编写程序计算该表达式的值。表达式包含+、-、*、\、(、),所有运算均为二元运算,操作数均为正整数,但可能不止一位,不超过5位。 运算结果为整数。 除法运算结果若为小数则进行截尾取整。若除法运算中除数为0,则输出ILLEGAL。

输入格式:

输入为一个字符串,表示中缀表达式

输出格式:

输出为一个整数,为表达式的值;或者为一个字符串ILLEGAL。

输入样例:

5+(10*2)-6

输出样例:

19

输入样例:

8*(999+1)

输出样例:

8000

输入样例:

1+5/(1-1)

输出样例:

ILLEGAL

代码如下: 

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Scanner;
  4. import java.util.Stack;
  5. public class Main {
  6. public static void main(String[] args) {
  7. Scanner scanner = new Scanner(System.in);
  8. String notation = scanner.next();
  9. //因为直接对String类型的字符串操作不方便,因此将其转换为对应的List;
  10. List<String> str1 = parseSuffixNotation(toInfixNotation(notation));
  11. if (calculate(str1)[1] == 1) {
  12. System.out.println(calculate(str1)[0]);
  13. } else {
  14. System.out.println("ILLEGAL");
  15. }
  16. }
  17. public static List<String> toInfixNotation(String s) {
  18. List<String> ls = new ArrayList<>();
  19. String str;
  20. char c;
  21. for (int i = 0; i < s.length(); i ++) {
  22. if (s.charAt(i) < 48 || s.charAt(i) > 57) {
  23. ls.add(s.charAt(i) + "");
  24. } else {
  25. str = "";
  26. int j = i;
  27. while (j < s.length() && s.charAt(j) >= 48 && s.charAt(j) <= 57) {
  28. //但数字大于一位数时,i一定要再多往后移一位
  29. if (j > i) {
  30. i ++;
  31. }
  32. str += s.charAt(j);
  33. j ++;
  34. }
  35. ls.add(str);
  36. }
  37. }
  38. return ls;
  39. }
  40. public static List<String> parseSuffixNotation(List<String> ls) {
  41. //符号栈
  42. Stack<String> s1 = new Stack<>();
  43. //存储中间结果的栈,因为在整个过程没有栈的弹出过程因此换为List
  44. List<String> s2 = new ArrayList<String>();
  45. for (String item: ls) {
  46. if (item.matches("\\d+") ) {
  47. s2.add(item);
  48. } else if (item.equals("(")) {
  49. s1.push(item);
  50. } else if (item.equals(")")) {
  51. while (!s1.peek().equals("(")) {
  52. s2.add(s1.pop());
  53. }
  54. s1.pop();
  55. } else if (item.equals("+") || item.equals("-")) {
  56. int count = 0;
  57. while (s1.size() != 0) {
  58. //当加减号入栈时,所有优先级不低于其的符号全部出栈,除非遇到括号
  59. if (s1.peek().equals("(")) {
  60. break;
  61. }
  62. s2.add(s1.pop());
  63. }
  64. s1.push(item);
  65. } else if (item.equals("*") || item.equals("/")) {
  66. s1.push(item);
  67. }
  68. }
  69. while (s1.size() != 0) {
  70. s2.add(s1.pop());
  71. }
  72. return s2;
  73. }
  74. public static int[] calculate(List<String> ls) {
  75. int n = 1;
  76. int[] arr = new int[2];
  77. Stack<Integer> stack = new Stack<>();
  78. Quit :
  79. for (int i = 0;i < ls.size(); i ++) {
  80. int a;
  81. int b;
  82. int result;
  83. switch (ls.get(i)) {
  84. case "+":
  85. a = stack.pop();
  86. b = stack.pop();
  87. result = b + a;
  88. stack.push(result);
  89. break;
  90. case "-":
  91. a = stack.pop();
  92. b = stack.pop();
  93. result = b - a;
  94. stack.push(result);
  95. break;
  96. case "*":
  97. a = stack.pop();
  98. b = stack.pop();
  99. result = b * a;
  100. stack.push(result);
  101. break;
  102. case "/":
  103. a = stack.pop();
  104. b = stack.pop();
  105. if (a == 0) {
  106. n = 0;
  107. break Quit;
  108. }
  109. result = b / a;
  110. stack.push(result);
  111. break;
  112. default:
  113. stack.push(Integer.parseInt(ls.get(i)));
  114. break;
  115. }
  116. }
  117. arr[0] = stack.pop();
  118. arr[1] = n;
  119. return arr;
  120. }
  121. }

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号