使用Java函数实现逆波兰表达式求值算法
发布时间:2023-07-03 07:38:55
逆波兰表达式也叫后缀表达式,是一种只使用后缀形式而不使用括号来表示运算符优先级的数学表达式。例如,中缀表达式 "3 + 4" 可以转换为后缀表达式 "3 4 +"。逆波兰表达式求值算法即通过使用栈来计算后缀表达式的值。
接下来,我们将用Java函数实现逆波兰表达式求值算法。
首先,我们需要定义一个函数 evalRPN,该函数接收一个字符串数组 tokens,其中包含逆波兰表达式的操作数和运算符。
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for (String token : tokens) {
if (isOperator(token)) {
int operand2 = stack.pop();
int operand1 = stack.pop();
stack.push(evaluate(token, operand1, operand2));
} else {
stack.push(Integer.parseInt(token));
}
}
return stack.pop();
}
在这个函数中,我们定义了一个栈 stack,用于存储逆波兰表达式的操作数。接下来,我们遍历传入的字符串数组 tokens,并通过判断当前元素是否为操作符来执行相应的操作。若为操作符,则从栈中弹出栈顶的两个元素作为操作数,并调用 evaluate 函数来计算结果,将计算结果压入栈中;如果是操作数,则将其转换成整数并压入栈中。
为了判断一个字符串是否为操作符,我们可以定义一个辅助函数 isOperator:
private boolean isOperator(String token) {
return token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/");
}
接下来,我们需要实现函数 evaluate,该函数接收一个操作符 operator 和两个操作数 operand1、operand2,并返回运算结果。
private int evaluate(String operator, int operand1, int operand2) {
switch (operator) {
case "+":
return operand1 + operand2;
case "-":
return operand1 - operand2;
case "*":
return operand1 * operand2;
case "/":
return operand1 / operand2;
default:
throw new IllegalArgumentException("Invalid operator: " + operator);
}
}
在这个函数中,我们根据传入的操作符来执行相应的运算,并返回结果。若操作符无效,则抛出异常。
最后,我们可以使用下面的代码来测试逆波兰表达式求值算法:
public static void main(String[] args) {
String[] tokens = {"2", "1", "+", "3", "*"};
int result = evalRPN(tokens);
System.out.println(result);
}
输出结果为 9,符合预期。
综上所述,以上就是使用Java函数实现逆波兰表达式求值算法的过程。在实现过程中,我们使用了栈来存储操作数,并通过遍历逆波兰表达式中的元素来执行相应的操作。
