java表达式计算
时间: 2023-06-28 09:08:04 浏览: 59
Java中可以使用表达式计算器来计算表达式的值。以下是一个简单的例子:
```java
import java.util.*;
import java.math.*;
public class ExpressionCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入表达式:");
String expression = scanner.nextLine();
BigDecimal result = evaluate(expression);
System.out.println("计算结果:" + result.toString());
}
public static BigDecimal evaluate(String expression) {
Stack<String> operatorStack = new Stack<>();
Stack<BigDecimal> operandStack = new Stack<>();
StringTokenizer tokenizer = new StringTokenizer(expression, "+-*/()", true);
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken().trim();
if (token.length() == 0) {
continue;
}
if (isOperator(token)) {
while (!operatorStack.isEmpty() && comparePrecedence(operatorStack.peek(), token) >= 0) {
BigDecimal operand2 = operandStack.pop();
BigDecimal operand1 = operandStack.pop();
String operator = operatorStack.pop();
BigDecimal result = evaluateOperation(operand1, operand2, operator);
operandStack.push(result);
}
operatorStack.push(token);
} else if (token.equals("(")) {
operatorStack.push(token);
} else if (token.equals(")")) {
while (!operatorStack.peek().equals("(")) {
BigDecimal operand2 = operandStack.pop();
BigDecimal operand1 = operandStack.pop();
String operator = operatorStack.pop();
BigDecimal result = evaluateOperation(operand1, operand2, operator);
operandStack.push(result);
}
operatorStack.pop();
} else {
operandStack.push(new BigDecimal(token));
}
}
while (!operatorStack.isEmpty()) {
BigDecimal operand2 = operandStack.pop();
BigDecimal operand1 = operandStack.pop();
String operator = operatorStack.pop();
BigDecimal result = evaluateOperation(operand1, operand2, operator);
operandStack.push(result);
}
return operandStack.pop();
}
private static boolean isOperator(String token) {
return token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/");
}
private static int comparePrecedence(String operator1, String operator2) {
int precedence1 = getPrecedence(operator1);
int precedence2 = getPrecedence(operator2);
return precedence1 - precedence2;
}
private static int getPrecedence(String operator) {
switch (operator) {
case "+":
case "-":
return 1;
case "*":
case "/":
return 2;
default:
throw new IllegalArgumentException("不支持的操作符:" + operator);
}
}
private static BigDecimal evaluateOperation(BigDecimal operand1, BigDecimal operand2, String operator) {
switch (operator) {
case "+":
return operand1.add(operand2);
case "-":
return operand1.subtract(operand2);
case "*":
return operand1.multiply(operand2);
case "/":
return operand1.divide(operand2);
default:
throw new IllegalArgumentException("不支持的操作符:" + operator);
}
}
}
```
该程序使用两个栈来实现表达式计算:一个栈用于存储运算符,另一个栈用于存储操作数。程序首先将输入的表达式分解为运算符和操作数,并按照优先级计算表达式的值。其中,使用了BigDecimal类来处理浮点数计算的精度问题。