题解 | #表达式求值#
表达式求值
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; } }