栈和队列理论
- C++中stack,queue 是容器么?
- 我们使用的stack,queue是属于那个版本的STL?
- 我们使用的STL中stack,queue是如何实现的?
- stack,queue 提供迭代器来遍历空间么?
stack和queue是STL中的容器适配器,不是类似list,vector那样的容器;
容器适配器本质上是基于底层真实容器(如 deque、list、vector)的一层封装,提供了特定的数据结构接口;
stack、queue默认基于deque实现;
不提供迭代器来遍历空间;
滑动窗口最大值问题
知识点:队列——单调队列;
主要思想:队列只需要维护有可能成为窗口里最大值的元素即可同时保证队列里的元素数值是由大到小的;
支持维护元素单调递减的队列就叫做单调队列,即单调递减或者单调递增的队列;c++不直接支持单调队列,需要我们自己来实现;
设计的时候,我们需要知道:
单调队列并不是一成不变的,而是不同场景不同写法;总之需要保证队列里单调递减或者递增的原则;
求前K个高频元素
知识点:优先级队列:priority_queue分为大根堆和小根堆两种,缺省默认大根堆;
格式:priority_queue<元素,存放结构,比较原则>
小根堆:重载();
代码如下:
class mycomparison{public:bool operator()(const pair<int,int>&lhs,const pair<int,int>&rhs){return lhs.second > rhs.second;}};
一样有pop,push,front接口;
总结
在栈与队列系列中,我们强调栈与队列的基础,也是很多同学容易忽视的点。
使用抽象程度越高的语言,越容易忽视其底层实现,而C++相对来说是比较接近底层的语言。
我们用栈实现队列,用队列实现栈来掌握的栈与队列的基本操作。
接着,通过括号匹配问题、字符串去重问题、逆波兰表达式问题来系统讲解了栈在系统中的应用,以及使用技巧。
通过求滑动窗口最大值,以及前K个高频元素介绍了两种队列:单调队列和优先级队列,这是特殊场景解决问题的利器,是一定要掌握的。