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);
}
}