题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
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 expression = in.nextLine(); // 读取一行输入作为算术表达式
int result = evaluate(expression);
System.out.println(result); // 输出计算结果
}
private static int evaluate(String expression) {
Stack<Integer> values = new Stack<>();
Stack<Character> operators = new Stack<>();
for (int i = 0; i < expression.length(); i++) {
char ch = expression.charAt(i);
if (Character.isDigit(ch)) { // 如果是数字,则构建完整的数字
int temp = i;
int val = 0;
while (i < expression.length() && Character.isDigit(expression.charAt(i))) {
val = (val * 10) + (expression.charAt(i) - '0');
i++;
}
values.push(val);
if(!operators.empty()){
if(temp>=2&&expression.charAt(temp-1)=='-'&&(expression.charAt(temp-2)=='(') || temp==1&&expression.charAt(0)=='-'){
values.pop();
values.push(-val);
operators.pop();
}
}
i--; // 回退一步以考虑运算符或下一个数字
} else if (ch == '(') { // 如果是左括号,压入操作符栈
operators.push(ch);
} else if (ch == ')') { // 如果是右括号,计算括号内的表达式
while (!operators.isEmpty() && operators.peek() != '(')
values.push(applyOp(operators.pop(), values.pop(), values.pop()));
operators.pop(); // 移除左括号
} else if (isOperator(ch)) { // 如果是运算符
while (!operators.isEmpty() && hasPrecedence(ch, operators.peek()))
values.push(applyOp(operators.pop(), values.pop(), values.pop()));
operators.push(ch);
}
}
while (!operators.empty()) { // 计算剩余的操作
if (values.empty()) break;
values.push(applyOp(operators.pop(), values.pop(), values.pop()));
}
return values.pop();
}
private static boolean isOperator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}
private static boolean isAllOperator(char ch) {
return ch == '-' || ch == '(';
}
private static boolean hasPrecedence(char op1, char op2) {
if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-')) {
return false;
} else if ((op1 == '+' || op1 == '-') && (op2 == '*' || op2 == '/')) {
return true;
} else if (op2 == '(') {
return false;
} else {
return true;
}
}
private static int applyOp(char op, int b, int a) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
if (b == 0) throw new UnsupportedOperationException("Cannot divide by zero");
return a / b;
}
return 0;
}
}

