当前位置:   article > 正文

java 代码实现 加减乘除表达式的计算_java乘除法

java乘除法
  1. class text{
  2. public static int mixingOperation(String infixExpression) {
  3. System.out.println("原始中缀表达式为: " + infixExpression);
  4. // 1. 处理中括号和小括号
  5. String newInfixExpression = handlerParentheses(infixExpression);
  6. System.out.println("处理括号后的新的中缀表达式为: " + newInfixExpression);
  7. // 2. 中缀表达式转换为后缀表达式
  8. String[] postfixExpressionArray = transformExpression(newInfixExpression);
  9. StringBuffer postfixExpressionBuffer = new StringBuffer();
  10. for (int i = 0; i < postfixExpressionArray.length; i++) {
  11. if (null == postfixExpressionArray[i] || postfixExpressionArray[i].isEmpty()) {
  12. break;
  13. }
  14. postfixExpressionBuffer.append(postfixExpressionArray[i]).append(" ");
  15. }
  16. System.out.println("后缀表达式为: " + postfixExpressionBuffer.toString());
  17. // 后缀表达式求值
  18. int result = calculateResultByPostfixExpression(postfixExpressionArray);
  19. System.out.println("表达式: " + infixExpression + " = " + result);
  20. return result;
  21. }
  22. private static int calculateResultByPostfixExpression(String[] postfixExpressionArray) {
  23. // 运算符和运算数栈
  24. Stack<String> calculateStack = new Stack<>();
  25. // 遍历中缀表达式数组
  26. for (int i = 0; i < postfixExpressionArray.length; i++) {
  27. if (null == postfixExpressionArray[i] || postfixExpressionArray[i].isEmpty()) {
  28. break;
  29. }
  30. String currentStr = postfixExpressionArray[i];
  31. switch (currentStr) {
  32. // 如果是运算符, 将栈顶元素作为第二个操作数并出栈, 然后新的栈顶元素作为第一个操作数并出栈,
  33. // 然后使用 操作数1、运算符、操作数2 进行运算, 并将结果入栈
  34. case "+" :
  35. case "-" :
  36. case "*" :
  37. case "/" :
  38. if (!calculateStack.empty()) {
  39. // 栈顶元素作为操作数2并出栈
  40. int operand2 = Integer.valueOf(calculateStack.pop());
  41. // 新的栈顶元素作为操作数1
  42. int operand1 = Integer.valueOf(calculateStack.pop());
  43. // 计算结果
  44. int result = calculateResult(operand1, currentStr, operand2);
  45. // 将结果入栈
  46. calculateStack.push(String.valueOf(result));
  47. }
  48. break;
  49. default:
  50. // 如果是操作数, 则直接入栈
  51. calculateStack.push(currentStr);
  52. }
  53. }
  54. // 处理完成之后输出栈顶元素即为最终结果
  55. return Integer.valueOf(calculateStack.pop());
  56. }
  57. private static int calculateResult(int operand1, String currentStr, int operand2) {
  58. int result = 0;
  59. switch (currentStr) {
  60. case "+" :
  61. result = operand1 + operand2;
  62. break;
  63. case "-" :
  64. result = operand1 - operand2;
  65. break;
  66. case "*" :
  67. result = operand1 * operand2;
  68. break;
  69. case "/" :
  70. if (operand2 == 0) {
  71. return 0;
  72. }
  73. result = operand1 / operand2;
  74. break;
  75. default:
  76. }
  77. return result;
  78. }
  79. private static String[] transformExpression(String newInfixExpression) {
  80. // 运算符栈
  81. Stack<String> operatorStack = new Stack<>();
  82. // 操作数缓冲区
  83. StringBuffer tempOperandBuffer = new StringBuffer();
  84. // 后缀表达式
  85. String postfixExpression = null;
  86. // 后缀表达式数组
  87. String[] postExpressionArray = new String[newInfixExpression.length()];
  88. // 数组下标
  89. int index = 0;
  90. // 存储数组的标识
  91. boolean flag = false;
  92. // 遍历中缀表达式
  93. for (int i = 0; i < newInfixExpression.length(); i++) {
  94. // 当前字符转换为字符串, 存储栈
  95. String currentStr = String.valueOf(newInfixExpression.charAt(i));
  96. // System.out.println("当前字符为: " + currentStr);
  97. switch (currentStr) {
  98. // 如果是加号运算符或者减号运算符
  99. // 根据转换规则, 需判断当前运算符与栈顶元素运算符的优先级, 并将当前运算符入栈
  100. case "+":
  101. case "-":
  102. // 栈顶元素如果不是左括号 "(", 则依次出栈并输出
  103. while (!operatorStack.empty()) {
  104. if (!"(".equals(operatorStack.peek())) {
  105. postExpressionArray[index++] = operatorStack.peek();
  106. operatorStack.pop();
  107. } else {
  108. break;
  109. }
  110. }
  111. // 处理完出战的逻辑或者栈为空, 则将当前运算符入栈
  112. operatorStack.push(currentStr);
  113. flag = true;
  114. break;
  115. // 如果是乘号运算符或者除号运算符
  116. // 根据转换规则, 需判断当前运算符与栈顶元素运算符的优先级, 并将当前运算符入栈
  117. case "*":
  118. case "/":
  119. while (!operatorStack.empty()) {
  120. // 如果栈顶元素的优先级与当前运算符的优先级相同, 即栈顶元素为 "*" 或 "/", 则栈顶元素出栈并输出
  121. if ("*".equals(operatorStack.peek()) || "/".equals(operatorStack.peek())) {
  122. postExpressionArray[index++] = operatorStack.peek();
  123. operatorStack.pop();
  124. } else {
  125. break;
  126. }
  127. }
  128. operatorStack.push(currentStr);
  129. flag = true;
  130. break;
  131. // 如果是左括号, 直接入栈
  132. case "(":
  133. operatorStack.push(currentStr);
  134. flag = true;
  135. break;
  136. // 如果是右括号, 则匹配左括号
  137. case ")":
  138. while (!operatorStack.empty()) {
  139. if (!tempOperandBuffer.toString().isEmpty()) {
  140. postExpressionArray[index++] = tempOperandBuffer.toString();
  141. tempOperandBuffer = new StringBuffer();
  142. flag = false;
  143. }
  144. // 将距离栈顶元素最近的左括号之前的运算符全部出栈并输出, 并将左括号也输出
  145. if (!"(".equals(operatorStack.peek())) {
  146. postExpressionArray[index++] = operatorStack.peek();
  147. operatorStack.pop();
  148. } else {
  149. operatorStack.pop();
  150. break;
  151. }
  152. }
  153. break;
  154. // 如果是数字, 则直接记录进后缀表达式缓冲区中
  155. default:
  156. if (flag) {
  157. if (!tempOperandBuffer.toString().isEmpty()) {
  158. postExpressionArray[index++] = tempOperandBuffer.toString();
  159. }
  160. tempOperandBuffer = new StringBuffer(currentStr);
  161. flag = false;
  162. } else {
  163. tempOperandBuffer.append(currentStr);
  164. }
  165. }
  166. }
  167. // 处理操作数缓冲区的内容
  168. if (!tempOperandBuffer.toString().isEmpty()) {
  169. postExpressionArray[index++] = tempOperandBuffer.toString();
  170. }
  171. // 遍历完中缀表达式之后, 将栈中元素依次输出
  172. while (!operatorStack.empty()) {
  173. postExpressionArray[index++] = operatorStack.peek();
  174. operatorStack.pop();
  175. }
  176. return postExpressionArray;
  177. }
  178. private static String handlerParentheses(String infixExpression) {
  179. return infixExpression.replace("[", "(")
  180. .replace("]", ")").replace("{", "(")
  181. .replace("}", ")");
  182. }
  183. public static void main(String[] args) {
  184. int result = mixingOperation("5+7*3+2");
  185. }
  186. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/848200
推荐阅读
相关标签
  

闽ICP备14008679号