让我们来逐步构建这个简单的四则运算解析器。我们可以使用栈来处理运算符的优先级和括号。以下是一些代码提示,帮助你实现这个功能:
-
处理数字和运算符:
- 使用两个栈,一个用于存储数字,另一个用于存储运算符。
-
处理括号:
- 当遇到左括号
(时,将其压入运算符栈。 - 当遇到右括号
)时,从运算符栈中弹出运算符,直到遇到左括号(。
- 当遇到左括号
-
处理运算符:
- 当遇到运算符时,比较其与栈顶运算符的优先级。如果当前运算符优先级较低或相等,先处理栈顶运算符。
-
计算表达式:
- 当表达式处理完毕后,依次从运算符栈中弹出运算符,并从数字栈中弹出相应的数字进行计算。
以下是一些代码提示,帮助你实现这些步骤:
import java.util.Stack;
public class Main {
public static int solution(String expression) {
Stack<Integer> numbers = 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 num = ch - '0';
while (i + 1 < expression.length() && Character.isDigit(expression.charAt(i + 1))) {
num = num * 10 + (expression.charAt(++i) - '0');
}
numbers.push(num);
} else if (ch == '(') {
// 处理左括号
operators.push(ch);
} else if (ch == ')') {
// 处理右括号
while (!operators.isEmpty() && operators.peek() != '(') {
// 计算括号内的表达式
// 这里需要实现一个计算函数
// numbers.push(calculate(numbers.pop(), numbers.pop(), operators.pop()));
}
operators.pop(); // 弹出左括号
} else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
// 处理运算符
while (!operators.isEmpty() && precedence(operators.peek()) >= precedence(ch)) {
// 计算优先级高的运算符
// 这里需要实现一个计算函数
// numbers.push(calculate(numbers.pop(), numbers.pop(), operators.pop()));
}
operators.push(ch);
}
}
// 处理剩余的运算符
while (!operators.isEmpty()) {
// 这里需要实现一个计算函数
// numbers.push(calculate(numbers.pop(), numbers.pop(), operators.pop()));
}
return numbers.pop();
}
// 计算运算符优先级
private static int precedence(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
}
return -1;
}
// 计算函数
// private static int calculate(int b, int a, char op) {
// switch (op) {
// case '+': return a + b;
// case '-': return a - b;
// case '*': return a * b;
// case '/': return a / b;
// }
// return 0;
// }
public static void main(String[] args) {
// You can add more test cases here
System.out.println(solution("1+1") == 2);
System.out.println(solution("3+4*5/(3+2)") == 7);
System.out.println(solution("4+2*5-2/1") == 12);
System.out.println(solution("(1+(4+5+2)-3)+(6+8)") == 23);
}
}
关键步骤注释
- 处理数字:将字符串中的数字转换为整数并压入数字栈。
- 处理括号:遇到左括号时压入运算符栈,遇到右括号时计算括号内的表达式。
- 处理运算符:根据运算符的优先级进行计算。
- 计算函数:实现一个计算函数来处理具体的运算。
你可以根据这些提示逐步实现代码,如果有任何问题或需要进一步的帮助,请告诉我!