2024.1.22(150. 逆波兰表达式求值)
相信看完动画大家应该知道,这和1047. 删除字符串中的所有相邻重复项是差不错的,只不过本题不要相邻元素做消除了,而是做运算!
// 定义一个Solution类
class Solution {
// 定义一个公共方法evalRPN,用于计算逆波兰表示法的表达式的值
public int evalRPN(String[] tokens) {
Deque stack = new LinkedList<>(); // 创建一个双端队列来模拟栈操作
// 遍历tokens数组中的每个元素
for (String s : tokens) {
// 如果当前元素是"+",则从栈中弹出两个元素并相加,然后将结果推回栈中
if ("+".equals(s)) { // 注意:由于LeetCode环境内置的JDK版本问题,不能使用==来判断字符串是否相等
stack.push(stack.pop() + stack.pop()); // 注意:这里的-和/需要特殊处理
// 如果当前元素是"-",则从栈中弹出两个元素并相减,然后将结果推回栈中
} else if ("-".equals(s)) {
stack.push(-stack.pop() + stack.pop());
// 如果当前元素是"*",则从栈中弹出两个元素并相乘,然后将结果推回栈中
} else if ("*".equals(s)) {
stack.push(stack.pop() * stack.pop());
// 如果当前元素是"/",则从栈中弹出两个元素并相除,然后将结果推回栈中
} else if ("/".equals(s)) {
int temp1 = stack.pop(); // 弹出第二个元素作为除数
int temp2 = stack.pop(); // 弹出第一个元素作为被除数
stack.push(temp2 / temp1); // 将结果推回栈中
// 如果当前元素不是运算符,则将其转换为整数并推入栈中
} else {
stack.push(Integer.valueOf(s)); // 将字符串转换为整数并推入栈中
}
}
// 返回栈顶的元素,即整个表达式的计算结果
return stack.pop();
}
}
这段代码使用一个双端队列(Deque)来模拟栈操作。它遍历输入的tokens数组中的每个元素,根据元素的类型执行相应的操作。如果元素是运算符,则从栈中弹出两个元素进行相应的运算;如果元素是数字,则将其转换为整数并推入栈中。最后,返回栈顶的元素作为整个表达式的计算结果。