用java编写代码实现混合四则运算需包括加减乘除以及括号的应用
时间: 2024-09-19 21:06:12 浏览: 52
在Java中,你可以使用栈数据结构来实现混合四则运算,这通常涉及到递归下降解析法(Recursive Descent Parsing)。下面是一个简单的例子,展示了如何处理这种表达式:
```java
import java.util.Stack;
public class Calculator {
public static int evaluate(String expression) {
Stack<Integer> numStack = new Stack<>();
Stack<Character> opStack = new Stack<>();
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (Character.isDigit(c)) {
// 如果遇到数字,直接压入数栈
numStack.push(Integer.parseInt(String.valueOf(c)));
} else if (c == '+' || c == '-' || c == '*' || c == '/') {
// 遇到运算符,先计算前两个操作数
while (!opStack.isEmpty() && hasPrecedence(c, opStack.peek())) {
numStack.push(applyOp(numStack.pop(), numStack.pop(), opStack.pop()));
}
opStack.push(c);
} else if (c == '(') {
opStack.push(c);
} else if (c == ')') {
while (!opStack.isEmpty() && opStack.peek() != '(') {
numStack.push(applyOp(numStack.pop(), numStack.pop(), opStack.pop()));
}
opStack.pop();
}
}
// 计算剩余的操作数
while (!opStack.isEmpty()) {
numStack.push(applyOp(numStack.pop(), numStack.pop(), opStack.pop()));
}
return numStack.pop();
}
private static boolean hasPrecedence(char op1, char op2) {
// 判断优先级,这里假设+、-优先级高于*、/
return (op1 == '+' || op1 == '-') && (op2 == '*' || op2 == '/');
}
private static int applyOp(int b, int a, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
if (b != 0)
return a / b;
else
throw new ArithmeticException("Division by zero is not allowed");
default:
throw new IllegalArgumentException("Invalid operator");
}
}
public static void main(String[] args) {
System.out.println(evaluate("(1+2)*3")); // 输出9
}
}
```
在这个示例中,`evaluate`方法逐字符遍历输入字符串,对遇到的数字和运算符进行处理。注意这个实现假设了左结合的运算顺序(即先做最近的),如果需要按照常规的数学运算顺序(右结合),你需要调整`applyOp`函数。
阅读全文