Java 实现一个计算器,允许公式的互相嵌套,要求对用户输入的计算式进行校验,校验公式的参数数量、格式等
时间: 2024-10-16 19:17:49 浏览: 33
一种高速嵌套CRC码的生成方法及其FPGA实现.pdf
为了在Java中实现一个支持嵌套公式且具备输入校验功能的计算器,我们可以使用递归解析器或正则表达式结合栈结构来处理。这里是一个简单的思路:
首先,我们需要创建一个Calculator类,其中包含一个方法`evaluateFormula`来执行计算。这个方法会接受一个字符串作为输入,并按照特定的规则检查参数的数量和格式。
```java
public class Calculator {
public static double evaluateFormula(String formula) {
// 使用正则表达式验证输入格式是否合法
if (!isValidFormula(formula)) {
throw new IllegalArgumentException("Invalid formula");
}
// 使用递归或栈来解析并计算嵌套的表达式
return parseAndCalculate(formula);
}
private static boolean isValidFormula(String formula) {
// 正则表达式示例,这里只做基本的验证,实际应用需要更复杂的规则
String regex = "^[0-9+\\-*/()]*$";
return formula.matches(regex);
}
private static double parseAndCalculate(String formula) {
// 这里可以使用递归解析,例如使用递归下降解析法,或者将公式转化为树形结构再计算
// 如果是简单嵌套,可以使用栈逐层处理
// 示例代码仅作演示,不完整
Stack<Integer> opsStack = new Stack<>();
int leftParen = 0;
double result = 0;
for (int i = 0; i < formula.length(); i++) {
char c = formula.charAt(i);
if (c == ' ') continue;
if (Character.isDigit(c)) {
// 处理数字部分
} else if (c == '+' || c == '-') {
// 处理操作符
while (!opsStack.isEmpty() && hasPrecedence(c, opsStack.peek())) {
// 弹出栈并计算
}
opsStack.push(c);
} else if (c == '*' || c == '/') {
// 同上,处理优先级更高的操作符
} else if (c == '(') {
leftParen++;
} else if (c == ')') {
leftParen--;
if (leftParen < 0) {
throw new IllegalArgumentException("Unmatched parenthesis");
}
} else {
throw new IllegalArgumentException("Unsupported character");
}
}
// 校验左右括号匹配并完成计算
while (!opsStack.isEmpty()) {
// ...
}
return result;
}
// 其他辅助方法,如比较操作符优先级
private static boolean hasPrecedence(char op1, char op2) {
// ...
}
}
```
阅读全文