使用java,编写一个程序,使用栈实现字符串”12+3*12++”的运算,依次读取字符,若为数字,则入栈,所谓运算符号,则出栈两个数字,并进行相应的运算,然后再入栈,继续往下读取数据,相当于计算(1+2)*3+(1+2)
时间: 2024-11-27 22:07:50 浏览: 12
在Java中,我们可以使用`LinkedList`作为栈的数据结构来实现这个简单的表达式求值。这里是一个基本的示例代码:
```java
import java.util.LinkedList;
public class StackBasedEvaluator {
private LinkedList<Integer> stack = new LinkedList<>();
private char currentOperator;
public int evaluate(String expression) {
for (char c : expression.toCharArray()) {
if (Character.isDigit(c)) {
// 数字直接压入栈
stack.add(Integer.parseInt(String.valueOf(c)));
} else if (c == '+' || c == '*' || c == '+=' || c == '*=') {
// 遇到运算符,弹出最近的两个数字进行运算
int num2 = stack.pop();
int num1 = stack.pop();
int result;
switch (currentOperator) {
case '+':
result = num1 + num2;
break;
case '*':
result = num1 * num2;
break;
case '+=':
stack.push(num1 + num2);
break; // 直接更新栈顶元素,不需要再次入栈
case '*=':
stack.push(num1 * num2);
break; // 同上
}
stack.push(result);
currentOperator = c; // 更新当前运算符
} else if (c == ')') {
// 结束一个操作数组,将剩余的栈顶元素加入结果
while (!stack.isEmpty() && stack.peek() != '(') {
int num = stack.pop();
result = stack.pop(); // 可能需要处理乘法赋值的情况
result += num;
stack.push(result);
}
if (!stack.isEmpty()) { // 检查是否有未处理的左括号
throw new IllegalArgumentException("Invalid expression");
}
} else if (c == '(') {
// 保存位置,遇到左括号暂时不动
currentOperator = c;
}
}
// 最终检查栈是否只剩下一个元素,即为最终结果
return stack.size() == 1 ? stack.pop() : -1; // 如果不是,说明表达式有问题
}
public static void main(String[] args) {
String expression = "12+3*12++";
StackBasedEvaluator evaluator = new StackBasedEvaluator();
System.out.println(evaluator.evaluate(expression)); // 输出:48
}
}
```
这个程序会计算字符串 `12+3*12++` 的值。请注意,这里假设 `++` 表示递增,实际的 Java 中 `++` 是前缀运算符,我们需要进一步解析或转换成后缀表达式。
阅读全文