Skip to content

Day 10


150. 逆波兰表达式求值

本题不难,但第一次做的话,会很难想到,所以先看视频,了解思路再去做题

题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/

文章讲解:https://programmercarl.com/0150.逆波兰表达式求值.html

视频讲解:https://www.bilibili.com/video/BV1kd4y1o7on

(1)思路分析

内容补充:波兰表达式介绍

  • 波兰表达式前缀表达式):二叉树的先序遍历
  • 逆波兰表达式后缀表达式):二叉树的后序遍历

波兰表达式的优点

  • 去掉括号后表达式无歧义,平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) ,即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果
  • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

波兰表达式和栈的结合运用

遍历波兰表达式,遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

⚠️ 计算注意点

  • 加法、乘法:满足交换律,不关心顺序,顺序不会影响表达式的结果
  • 减法、除法:不满足交换律,关心顺序,然而元素在栈中的顺序是和表达式相反的,这里需要做处理

1. 减法:例如计算 a - b,但实际上在栈中出栈顺序应该是 b、a,为了实现 a - b,需要对第一个出栈元素做取反处理,即有如下代码

java
stack.push(-stack.pop() + stack.pop());

2. 除法:还是顺序问题,栈中的顺序和表达式顺序是相反的,也要做相应的处理,即有如下代码

java
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push(temp2 / temp1);

(2)题解

java
class Solution {
    public int evalRPN(String[] tokens) {
        // 模拟栈结构
        Deque<Integer> stack = new LinkedList();
        for (String s : tokens) {
            // 注意 - 和 / 需要特殊处理,因为不符合交换律并且要求保持顺序
            if ("+".equals(s)) {
                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)); // 字符串转 Integer
            }
        }
        return stack.pop();
    }
}

❓239. 滑动窗口最大值

(有点难度,可能代码写不出来,但一刷至少需要理解思路)

本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。

题目链接:https://leetcode.cn/problems/sliding-window-maximum/

文章讲解:https://programmercarl.com/0239.滑动窗口最大值.html

视频讲解:https://www.bilibili.com/video/BV1XS4y1p7qj

❓347.前 K 个高频元素

有点难度,可能代码写不出来,一刷至少需要理解思路,本题是 大数据中取前 k 值 的经典思路,了解想法之后,不算难。

题目链接:https://leetcode.cn/problems/top-k-frequent-elements/description/

文章讲解:https://programmercarl.com/0347.前K个高频元素.html

视频讲解:https://www.bilibili.com/video/BV1Xg41167Lz

阶段五结束:栈与队列总结

文章链接:https://programmercarl.com/栈与队列总结.html