编写一个Java算数表达式求值的
时间: 2024-05-05 13:18:00 浏览: 95
算法。
好的,我可以为您提供一个基本的Java算数表达式求值算法。您只需要将表达式作为字符串传递给该函数即可。
首先,将表达式字符串转换为字符数组。我们使用ArrayList来保存数字和运算符,因为它可以动态调整大小。
接下来,创建一个Stack来保存运算符。遍历字符数组,如果当前字符是数字,则将它与没有前导零的其他字符组合在一起,形成一个完整的数字。将数字添加到ArrayList中。如果是运算符,则比较其优先级,如果栈顶运算符的优先级较高,则弹出栈顶运算符并将其添加到ArrayList中,直到栈顶运算符的优先级小于或等于当前运算符。然后将当前运算符推入堆栈。
当字符串遍历完毕后,将堆栈中的所有运算符弹出添加到ArrayList中,以此确保表达式中的所有运算符都处理掉。现在,我们有一个只包含数字和运算符的ArrayList。
最后,我们遍历ArrayList,执行运算,并使用另一个Stack来跟踪结果。对于每个数字或运算符,如果它是数字,则将其推入堆栈。如果它是运算符,则从堆栈中弹出两个数字进行计算,并将结果推回堆栈。最终堆栈中的最后一个数字就是表达式的计算结果。
下面是Java代码实现算数表达式的求值算法:
```java
import java.util.*;
public class ArithmeticExpressionEvaluator {
// 运算符优先级表
private static final Map<Character, Integer> operatorPriority = new HashMap<Character, Integer>() {{
put('+', 1);
put('-', 1);
put('*', 2);
put('/', 2);
}};
public static double evaluate(String expression) {
List<String> tokens = parse(expression);
Stack<Double> stack = new Stack<Double>();
for (String token : tokens) {
if (isOperator(token)) {
double b = stack.pop();
double a = stack.pop();
double result = evaluateOperator(a, b, token.charAt(0));
stack.push(result);
} else {
stack.push(Double.parseDouble(token));
}
}
return stack.peek();
}
private static List<String> parse(String expression) {
List<String> tokens = new ArrayList<String>();
char[] chars = expression.toCharArray();
int i = 0;
while (i < chars.length) {
if (Character.isDigit(chars[i])) {
// 读入数字
StringBuilder sb = new StringBuilder();
while (i < chars.length && Character.isDigit(chars[i])) {
sb.append(chars[i++]);
}
tokens.add(sb.toString());
} else if (isOperator(String.valueOf(chars[i]))) {
// 读入运算符
while (!operatorStack.isEmpty()
&& operatorPriority.get(operatorStack.peek().charAt(0)) >= operatorPriority.get(chars[i])) {
tokens.add(operatorStack.pop());
}
operatorStack.push(String.valueOf(chars[i++]));
} else {
// 忽略空格和其他字符
i++;
}
}
while (!operatorStack.isEmpty()) {
tokens.add(operatorStack.pop());
}
return tokens;
}
private static double evaluateOperator(double a, double b, char operator) {
switch (operator) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
default: throw new IllegalArgumentException("Invalid operator");
}
}
private static boolean isOperator(String token) {
return token.length() == 1 && operatorPriority.containsKey(token.charAt(0));
}
public static void main(String[] args) {
String expression = "3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3";
System.out.println("Result: " + evaluate(expression));
}
}
```
希望这可以帮助您实现您的项目!
阅读全文