编程实现:提供一个表达式的后缀表达式(自定义),运用栈的技术,求该表达式的值。java
时间: 2024-12-22 11:30:05 浏览: 2
在Java中,计算后缀表达式的值通常涉及到两个步骤:解析后缀表达式并将它们转换为逆波兰表示法(也称为前缀表达式),然后使用栈来执行这些操作。以下是一个简单的Java实现:
```java
import java.util.Stack;
class Calculator {
public int evaluate(String expression) {
Stack<Integer> values = new Stack<>();
Stack<Character> operators = new Stack<>();
for (char token : expression.toCharArray()) {
if (Character.isDigit(token)) { // 单个数字直接入栈
values.push(token - '0'); // 因为字符'0'的ASCII码为48
} else if (token == '+' || token == '-') { // 遇到运算符,先出栈处理完左边的运算
while (!operators.isEmpty() && hasPrecedence(token, operators.peek())) {
int right = values.pop();
int left = values.pop();
char op = operators.pop();
values.push(calculate(left, right, op));
}
operators.push(token);
} else if (token == '(') { // 遇到左括号,推入栈
operators.push(token);
} else if (token == ')') { // 遇到右括号,直到遇到左括号为止
while (!operators.isEmpty() && operators.peek() != '(') {
int right = values.pop();
int left = values.pop();
char op = operators.pop();
values.push(calculate(left, right, op));
}
operators.pop(); // 出栈左括号
}
}
// 处理剩下的运算
while (!operators.isEmpty()) {
int right = values.pop();
int left = values.pop();
char op = operators.pop();
values.push(calculate(left, right, op));
}
return values.pop(); // 返回最终结果
}
private boolean hasPrecedence(char op1, char op2) {
return (op2 == '*' || op2 == '/') && (op1 == '+' || op1 == '-');
}
private int calculate(int left, int right, char op) {
switch (op) {
case '+':
return left + right;
case '-':
return left - right;
case '*':
return left * right;
case '/':
return left / right; // 要注意避免整数除法错误
}
throw new IllegalArgumentException("Invalid operator");
}
}
// 使用示例
Calculator calculator = new Calculator();
String expression = "2 3 + 4 *";
int result = calculator.evaluate(expression);
System.out.println("Expression value: " + result);
```
这个代码定义了一个`Calculator`类,包含一个`evaluate`方法,用于计算给定后缀表达式的值。它利用了两个栈——一个存储数值,另一个存储运算符。遇到运算符时,会根据优先级规则和括号结构逐层处理,直到所有运算都完成。
阅读全文