import java.util.*; public class Solution { public int solve(String s) { // 用于存储运算符 LinkedList<Character> operator_stack = new LinkedList<>(); // 用于存储数字 LinkedList<Integer> num_stack = new LinkedList<>(); int num = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); // 如果当前字符是数字 if (Character.isDigit(c)) { num = num * 10 + (c - '0'); // 如果是计算式的最后一位或者后面一位不是数字 if (i + 1 == s.length() || !Character.isDigit(s.charAt(i + 1))) { num_stack.addLast(num); num = 0; } } // 如果当前字符不是数字 if (!Character.isDigit(c)) { if (c == '(') { operator_stack.addLast(c); } else if (c == ')') { // 遇到)时准备计算括号内表达式 while (operator_stack.peekLast() != '(') { calculate(num_stack, operator_stack); } // 把左括号出栈 operator_stack.removeLast(); } else { // 当前运算符优先级低于或等于运算符栈中等待运算的运算符 while (!operator_stack.isEmpty() && getPriority(c) <= getPriority(operator_stack.peekLast())) { calculate(num_stack, operator_stack); } // 将当前运算符入栈 operator_stack.addLast(c); } } } // 当运算符栈中还有运算符时,继续进行计算 while (!operator_stack.isEmpty()) { calculate(num_stack, operator_stack); } // 最后数字栈中剩下的唯一元素就是计算结果 return num_stack.removeLast(); } // 用于定义运算符的优先级,乘法的优先级高于加法和减法,括号的优先级最低。 public int getPriority(char operator) { if (operator == '+' || operator == '-') { return 1; } if (operator == '*') { return 2; } return -1; } // 用于执行具体的计算操作,从数字栈中弹出两个操作数,从运算符栈中弹出一个运算符,进行相应的计算,并将结果压入数字栈。 public void calculate(LinkedList<Integer> num_stack, LinkedList<Character> operator_stack) { int b = num_stack.removeLast(); int a = num_stack.removeLast(); char operator = operator_stack.removeLast(); int result = 0; if (operator == '+') { result = a + b; } else if (operator == '-') { result = a - b; } else if (operator == '*') { result = a * b; } num_stack.addLast(result); } }