题解 | 表达式求值
解题思路:
- 坑爹的题,这个真不是简单题型,各种判断,写了一遍,还是错误
- 小心 负号
- 只能求助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;
}
}


查看13道真题和解析