1. 题目

https://leetcode.cn/problems/basic-calculator/
2. 解法
解题思路:
- 使用两个栈,一个存储数字,一个存储运算符
- 遍历字符串,如果遇到数字,就将其转换为整数并压入数字栈
- 如果遇到运算符,就比较其与运算符栈顶的优先级,如果高于或等于栈顶的优先级,就压入运算符栈;如果低于栈顶的优先级,就从数字栈中弹出两个数字,从运算符栈中弹出一个运算符,进行计算,并将结果压入数字栈,重复这个过程直到运算符栈为空或者栈顶的优先级低于当前运算符
- 如果遇到左括号,就直接压入运算符栈
- 如果遇到右括号,就从数字栈中弹出两个数字,从运算符栈中弹出一个运算符,进行计算,并将结果压入数字栈,重复这个过程直到遇到左括号,并将左括号弹出
- 遍历完字符串后,如果运算符栈不为空,就继续从数字栈中弹出两个数字,从运算符栈中弹出一个运算符,进行计算,并将结果压入数字栈,直到运算符栈为空
- 最后从数字栈中弹出最终结果并返回
public class Solution {
public int calculate(String s) {
// 去除空格
s = s.replaceAll(" ", "");
// 创建两个栈
Stack<Integer> numStack = new Stack<>(); // 存储数字
Stack<Character> opStack = new Stack<>(); // 存储运算符
// 遍历字符串
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.isDigit(c)) { // 如果是数字
// 将连续的数字转换为整数
int num = c - '0';
while (i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))) {
num = num * 10 + (s.charAt(i + 1) - '0');
i++;
}
// 将整数压入数字栈
numStack.push(num);
} else if (c == '+' || c == '-') { // 如果是加号或减号
// 比较当前运算符与栈顶运算符的优先级
while (!opStack.isEmpty() && opStack.peek() != '(') {
// 如果栈顶运算符的优先级高于或等于当前运算符,就进行计算
int num2 = numStack.pop();
int num1 = numStack.pop();
char op = opStack.pop();
int res = calculate(num1, num2, op);
// 将计算结果压入数字栈
numStack.push(res);
}
// 将当前运算符压入运算符栈
opStack.push(c);
} else if (c == '(') { // 如果是左括号
// 直接压入运算符栈
opStack.push(c);
} else if (c == ')') { // 如果是右括号
// 从栈中弹出数字和运算符进行计算,直到遇到左括号
while (!opStack.isEmpty() && opStack.peek() != '(') {
int num2 = numStack.pop();
int num1 = numStack.pop();
char op = opStack.pop();
int res = calculate(num1, num2, op);
numStack.push(res);
}
// 将左括号弹出
opStack.pop();
}
}
// 遍历完字符串后,如果运算符栈不为空,就继续进行计算,直到运算符栈为空
while (!opStack.isEmpty()) {
int num2 = numStack.pop();
int num1 = numStack.pop();
char op = opStack.pop();
int res = calculate(num1, num2, op);
numStack.push(res);
}
// 最后从数字栈中弹出最终结果并返回
return numStack.pop();
}
// 定义一个辅助方法,用于计算两个数字和一个运算符的结果
private int calculate(int num1, int num2, char op) {
if (op == '+') {
return num1 + num2;
} else if (op == '-') {
return num1 - num2;
} else {
return 0; // 不会发生的情况
}
}
}
浙公网安备 33010602011771号