使用Java编写的最简单的逆波兰表达式计算函数
逆波兰表达式是一种基于后缀表达式的数学表达式表示方法,它能够利用栈的特性快速计算出表达式的值。在逆波兰表达式中,操作符位于操作数之后,因此可以直接根据顺序依次进行计算,并且不需要使用括号来确定运算的优先级。
Java 是一种非常流行的编程语言,因为它具有可移植性和安全性,让我们用 Java 实现一个简单的逆波兰表达式计算函数:
首先,我们需要定义一个操作符栈 Stack,用来存储操作符和操作数:
Stack<Double> stack = new Stack();
接着,我们可以输入一个字符串,将其分为操作数和操作符:
String[] tokens = input.split(" ");
遍历分离的 tokens 数组,如果当前的 token 是一个数字,将其放入操作符栈中:
for (String token : tokens) {
if (token.matches("-?\\d+(\\.\\d+)?")) {
stack.push(Double.parseDouble(token));
}
//如果当前的 token 是一个操作符,则从栈中弹出两个操作数并进行计算
else if (token.equals("+")) {
double operand2 = stack.pop();
double operand1 = stack.pop();
stack.push(operand1 + operand2);
} else if (token.equals("-")) {
double operand2 = stack.pop();
double operand1 = stack.pop();
stack.push(operand1 - operand2);
} else if (token.equals("*")) {
double operand2 = stack.pop();
double operand1 = stack.pop();
stack.push(operand1 * operand2);
} else if (token.equals("/")) {
double operand2 = stack.pop();
double operand1 = stack.pop();
stack.push(operand1 / operand2);
} else {
throw new IllegalArgumentException("Invalid input");
}
}
最后,我们从栈中弹出最后一个元素,这就是计算出的结果:
return stack.pop();
下面是完整的逆波兰表达式计算函数:
public static double evalRPN(String input) {
Stack<Double> stack = new Stack();
String[] tokens = input.split(" ");
for (String token : tokens) {
if (token.matches("-?\\d+(\\.\\d+)?")) {
stack.push(Double.parseDouble(token));
} else if (token.equals("+")) {
double operand2 = stack.pop();
double operand1 = stack.pop();
stack.push(operand1 + operand2);
} else if (token.equals("-")) {
double operand2 = stack.pop();
double operand1 = stack.pop();
stack.push(operand1 - operand2);
} else if (token.equals("*")) {
double operand2 = stack.pop();
double operand1 = stack.pop();
stack.push(operand1 * operand2);
} else if (token.equals("/")) {
double operand2 = stack.pop();
double operand1 = stack.pop();
stack.push(operand1 / operand2);
} else {
throw new IllegalArgumentException("Invalid input");
}
}
return stack.pop();
}
这个函数的时间复杂度为 O(n),其中 n 表示输入字符串的长度。它非常简单并且易于理解,并且可以用来计算基本的算数运算和表达式计算。如果需要更高级的计算和表达式处理,我们可能需要使用更复杂的算法和数据结构。
