一、C++ 栈
1、stack的定义
stack<typename> name;
其中,typename
可以是任何基本类型,例如 int
、double
、char
、结构体等,也可以是STL
标准容器,例如vector
、set
、queue
等。
2、stack容器内元素的访问
push()
push(x)
将 x 进行入栈,无返回值,时间复杂度为 O(1)。pop()
pop()
用以弹出栈顶元素,无返回值,时间复杂度为 O(1)。top()
top()
返回栈顶元素,时间复杂度为 O(1)。empty()
empty()
检测stack
是否为空,返回true
则空,返回false
则非空 。时间复杂度为 O(1)。size()
size()
返回stack
中元素的个数,时间复杂度为 O(1)。
二、C++ 队列
1、queue的定义
queue<typename> name;
其中,typename
可以是任何基本类型,例如 int
、double
、char
、结构体等,也可以是STL
标准容器,例如vector
、set
、queue
等。
2、queue容器内元素的访问
push()
push(x)
将 x 进行入队,无返回值,时间复杂度为 O(1)。pop()
pop()
令队首元素出队,无返回值,时间复杂度为 O(1)。front()
和back()
front()
和back()
可以分别获得队首元素和队尾元素,时间复杂度为 O(1)。empty()
empty()
检测queue
是否为空,返回true
则空,返回false
则非空 。时间复杂度为 O(1)。size()
size()
返回queue
中元素的个数,时间复杂度为 O(1)。
三、C++ 双端队列
1、deque介绍
deque
,double ended queue
即双端队列,是一种在两端均可以扩展或者收缩的序列化容器。
deque
可以在头部和尾部进行插入和删除操作。
2、deque的定义
deque<typename> name;
其中,typename
可以是任何基本类型,例如 int
、double
、char
、结构体等,也可以是STL
标准容器,例如vector
、set
、queue
等。
3、deque容器内元素的访问
push_back()
向deque
尾部添加一个元素push_front()
向deque
头部添加一个元素pop_back()
删除deque
尾部的一个元素pop_front()
删除deque
头部的一个元素front()
和back()
front()
返回deque第一个元素,back()
返回deque最后一个元素empty()
empty()
方法用来判断deque中是否有元素,如果有元素,返回false
;如果没有元素,返回true
。即为空返回true
,非空返回false
。size()
要想知道deque中有多少元素,使用deque.size()
方法,作用是返回deque
中元素的个数。
四、C++ 优先级队列
1、priority_queue介绍
- 既然是队列那么先要包含头文件
#include <queue>
, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。
2、优先队列的成员函数
- 与普通队列相同
3、priority_queue的定义
priority_queue<Type, Container, Functional>
Type
:数据类型Container
:容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector)Functional
: 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。
4、大堆顶与小堆顶
- 大堆顶(降序)
//构造一个空的优先队列(此优先队列默认为大顶堆) priority_queue<int> big_heap; //另一种构建大顶堆的方法 priority_queue<int,vector<int>,less<int> > big_heap2;
- 小堆顶(升序)
需要注意的是,如果使用less和greater,需要头文件://构造一个空的优先队列,此优先队列是一个小顶堆 priority_queue<int,vector<int>,greater<int> > small_heap;
#include <functional>
5、一个实例(map小堆顶)
class Solution {
public:
/*cmp可以作为priority_queue<>中的第三个参数*/
struct cmp{
/*注意这里使用到了仿函数*/
bool operator()(pair<int,int> p1,pair<int,int> p2){
/*map中value越大优先级越高,所以是个小堆顶*/
return p1.second>p2.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> mp;
for(int i=0;i<nums.size();i++){
mp[nums[i]]++;
}
/*注意看优先级队列的定义方式,这里调用了一个自定义的排序算法*/
priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> pri_que;
for(auto it=mp.begin();it!=mp.end();it++){
pri_que.push(*it);
if(pri_que.size()>k){
pri_que.pop();
}
}
vector<int> result;
for(int i=0;i<k;i++){
result.push_back(pri_que.top().first);
pri_que.pop();
}
return result;
}
};