夸父追日:第五章 栈与队列part02

今日收获:逆波兰表达式求值,滑动窗口最大值,前K个高频元素,栈和队列的总结

1. 逆波兰表达式求值

题目链接:150. - 力扣(LeetCode)

思路:借助栈。遍历字符串数组,遇到数字就压入栈,遇到运算符就连续弹出连个数字做运算,再把结果压入栈中

方法:

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack=new Stack<>();
        Integer num1=0;
        Integer num2=0;

        for (String token:tokens){
            if (token.equals("+")){
                num1=stack.pop();
                num2=stack.pop();
                stack.push(num1+num2);
            }else if (token.equals("-")){
                num1=stack.pop();
                num2=stack.pop();
                stack.push(num2-num1);
            }else if (token.equals("*")){
                num1=stack.pop();
                num2=stack.pop();
                stack.push(num1*num2);
            }else if (token.equals("/")){
                num1=stack.pop();
                num2=stack.pop();
                stack.push(num2/num1);
            }else {
                stack.push(Integer.parseInt(token));
            }
        }

        return stack.pop();
    }
}

总结:做运算的数字总是离运算符最相邻的两个数字,可以判断使用栈这种数据结构。另外要注意元素的运算顺序,是第二个出栈的元素除以/减去第一个出栈的元素。

2. 滑动窗口最大值

题目链接:239. - 力扣(LeetCode)

一刷了解思路:涉及单调队列的思想。滑动窗口类似与队列的结构,每次移动队尾添加元素,队头移除元素,而队列中的最大值始终在队列的出口处就是单调队列(以单调减队列为例)。所以每次添加元素时,将队列中小于当前值的元素全部移除,就可以维护一个单调队列。

二刷时一定啃得动!

3. 前K个高频元素

题目链接:347. - 力扣(LeetCode)

一刷了解思路:涉及优先级队列(其内部基于大顶堆或小顶对实现)。首先利用map存储每个元素及其出现的频率,然后利用优先级队列对频率进行排序。如果是大顶堆优先队列,遍历所有元素取前k个队头元素;如果是小顶堆优先队列,当队列元素小于k时直接添加新元素,否则需要和队头元素比较,大于队头元素时弹出队头元素再添加,小于就不用添加了。

二刷时一定啃得动!

4. 栈和队列的总结

(1)栈:适合消除相邻元素,或者匹配之前的元素

(2)队列:单调队列和优先级队列适合求最大/小值或取前几个最大/小值,和最值相关

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值