题目描述:中缀表达式求值
描述:
给定一个只包含 非负整数、加号 (+)、减号 (-)、以及括号 ()
的中缀表达式,请编写一个程序计算并返回该表达式的结果。该表达式中可能会包含多位数字和空格,但不包含其他运算符(如乘法、除法等)。
输入:
一个有效的中缀表达式,字符串形式。表达式中的数字为非负整数,并用空格隔开(空格可有可无)。支持嵌套括号,且保证括号配对合法。
输出:
计算表达式的结果,并返回该结果的整数值。
import java.util.Stack;
public class Main {
// 计算中缀表达式的结果
public static int calculate(String expression) {
// 用于存储数字的栈
Stack<Integer> numberStack = new Stack<>();
// 用于存储操作符的栈
Stack<Character> operatorStack = new Stack<>();
int index = 0;
while (index < expression.length()) {
char c = expression.charAt(index);
// 如果是数字
if (Character.isDigit(c)) {
int num = 0;
// 处理多位数
while (index < expression.length() && Character.isDigit(expression.charAt(index))) {
num = num * 10 + (expression.charAt(index) - '0');
index++;
}
// 将数字压入数字栈
numberStack.push(num);
} else if (c == '(') {
// 如果是左括号,将其压入操作符栈
operatorStack.push(c);
index++;
} else if (c == ')') {
// 如果是右括号,进行计算直到找到对应的左括号
while (!operatorStack.isEmpty() && operatorStack.peek()!= '(') {
int num2 = numberStack.pop();
int num1 = numberStack.pop();
char op = operatorStack.pop();
// 进行计算并将结果压入数字栈
numberStack.push(performOperation(num1, num2, op));
}
// 弹出左括号
operatorStack.pop();
index++;
} else if (c == '+' || c == '-') {
// 如果是操作符,将其压入操作符栈
operatorStack.push(c);
index++;
} else {
// 其他情况,继续下一个字符
index++;
}
}
// 处理剩余的操作符和数字
while (!operatorStack.isEmpty()) {
int num2 = numberStack.pop();
int num1 = numberStack.pop();
char op = operatorStack.pop();
numberStack.push(performOperation(num1, num2, op));
}
// 返回最终结果
return numberStack.pop();
}
// 根据操作符进行计算
private static int performOperation(int num1, int num2, char op) {
switch (op) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
default:
return 0;
}
}
public static void main(String[] args) {
String expression = "1+(2-3)+4";
int result = calculate(expression);
System.out.println("计算结果为:" + result);
}
}