CC2-后缀表达式求值
目录
一、题目描述
二、解题思路
(一)栈的核心作用
(二)算法步骤
三、代码实现
(一)完整代码
(二)代码解释
四、测试结果
五、总结
一、题目描述
计算逆波兰式(后缀表达式)的值。运算符仅包含 +
、-
、*
和 /
,操作数是整数,保证表达式合法,除法时向下取整。
示例:
- 输入:
["20", "10", "+", "30", "*"]
,计算过程为(20 + 10) * 30
,返回值:900
。 - 输入:
["40", "130", "50", "/", "+"]
,计算过程为40 + (130 / 50)
,返回值:42
。 - 输入:
["20"]
,返回值:20
。
二、解题思路
(一)栈的核心作用
利用栈来存储操作数。遍历后缀表达式的每个元素,当遇到操作数时,将其入栈;当遇到运算符时,从栈中弹出两个操作数,进行相应运算后,再将结果入栈。遍历结束后,栈中仅剩的元素就是后缀表达式的计算结果。
(二)算法步骤
- 初始化栈:创建一个整数类型的栈,用于存储操作数。
- 遍历后缀表达式:对于每个元素
token
:- 如果是操作数(即不是
+
、-
、*
、/
),将其转换为整数后入栈。 - 如果是运算符:
- 弹出栈顶的两个操作数,注意弹出的顺序,先弹出的是右操作数,后弹出的是左操作数。
- 根据运算符进行相应计算(
+
、-
、*
、/
),并将计算结果入栈。
- 如果是操作数(即不是
- 返回结果:遍历结束后,栈中唯一的元素就是后缀表达式的计算结果,将其弹出并返回。
三、代码实现
(一)完整代码
import java.util.*;public class Solution {/*** @param tokens string字符串一维数组,后缀表达式* @return int整型,表达式计算结果*/public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for (String token : tokens) {if (token.equals("+")) {stack.push(stack.pop() + stack.pop());} else if (token.equals("-")) {// 注意顺序,先弹出的是右操作数,后弹出的是左操作数,所以是左 - 右int right = stack.pop();int left = stack.pop();stack.push(left - right);} else if (token.equals("*")) {stack.push(stack.pop() * stack.pop());} else if (token.equals("/")) {// 除法向下取整,同样注意操作数顺序,左 / 右int right = stack.pop();int left = stack.pop();stack.push(left / right);} else {stack.push(Integer.parseInt(token));}}return stack.pop();}// 测试代码public static void main(String[] args) {Solution solution = new Solution();// 测试示例1String[] tokens1 = {"20", "10", "+", "30", "*"};int result1 = solution.evalRPN(tokens1);System.out.println("示例1结果:" + result1);// 测试示例2String[] tokens2 = {"40", "130", "50", "/", "+"};int result2 = solution.evalRPN(tokens2);System.out.println("示例2结果:" + result2);// 测试示例3String[] tokens3 = {"20"};int result3 = solution.evalRPN(tokens3);System.out.println("示例3结果:" + result3);}
}
(二)代码解释
- evalRPN 方法:核心方法,按照上述解题思路,利用栈实现后缀表达式的求值。在处理减法和除法时,要特别注意操作数的顺序,先弹出的是右操作数,后弹出的是左操作数。
- main 方法:用于测试,分别构建了题目中的示例以及单个操作数的情况,调用
evalRPN
方法计算结果并输出。
四、测试结果
运行测试代码,输出结果为:
示例1结果:900
示例2结果:42
示例3结果:20
与题目示例的预期结果一致,说明代码正确实现了后缀表达式的求值。
五、总结
通过栈这种数据结构,我们高效地解决了后缀表达式的求值问题。栈的 “后进先出” 特性完美契合了后缀表达式的计算逻辑,在遇到运算符时,能够方便地获取到所需的操作数进行计算。这种利用栈解决表达式求值的方法,在编译原理等领域也有广泛应用,掌握它有助于理解更复杂的表达式处理过程。