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; // 不会发生的情况 } } }