题解 | 表达式求值
解题思路:
- 坑爹的题,这个真不是简单题型,各种判断,写了一遍,还是错误
- 小心 负号
- 只能求助AI了,以下是AI提供的解法
import java.util.Scanner; import java.util.Stack; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); System.out.println(calculate(s)); } public static int calculate(String s) { // 去掉所有空格 s = s.replaceAll(" ", ""); // 使用栈来存储数字和中间结果 Stack<Integer> stack = new Stack<>(); // 当前数字 int num = 0; // 当前运算符 char sign = '+'; // 遍历字符串 for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); // 如果是数字,解析完整的数字 if (Character.isDigit(c)) { num = num * 10 + (c - '0'); } // 如果是左括号,递归计算括号内的表达式 if (c == '(') { int j = i, count = 0; for (; i < s.length(); i++) { if (s.charAt(i) == '(') count++; if (s.charAt(i) == ')') count--; if (count == 0) break; } num = calculate(s.substring(j + 1, i)); } // 如果是运算符或到达字符串末尾,处理栈中的内容 if (!Character.isDigit(c) || i == s.length() - 1) { if (sign == '+') { stack.push(num); } else if (sign == '-') { stack.push(-num); } else if (sign == '*') { stack.push(stack.pop() * num); } else if (sign == '/') { stack.push(stack.pop() / num); } // 更新当前运算符 sign = c; // 重置当前数字 num = 0; } } // 计算栈中所有数字的和 int result = 0; while (!stack.isEmpty()) { result += stack.pop(); } return result; } }