队列
元素先进先出,从队尾入队,从队首出队。只允许在最后面添加元素,只允许在最前面删除元素。
queue
- 初始化队列
queue<int> q
- 返回队首和队尾元素
q.front()
q.back()
- 尾部增加和删除一个元素
q.push()
q.pop()
- 队列长度和是否为空
q.size()
q.empty
队列模拟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| int q[N];
int hh = 0; tt = -1;
初始时tt = -1,队列为空,当 ++tt 之后 tt = hh = 0,给q[0]赋值,hh指向该队头元素
之后新元素入队,++tt往后移,元素出队,hh++,队头指针往后移。队列区间为[hh,tt]
q[++tt] = {}
hh ++
q[hh]
while(hh <= tt){
}
|
priority_queue(优先队列)
优先队列是在正常队列的基础上加了优先级,保证每次的队首元素都是优先级最大的。底层是通过堆(小根堆、大根堆)来实现的。
- 初始化
1 2 3 4 5 6 7 8 9 10 11
| priority_queue<int> q; priority_queue<int,vector<int>,great<int>> q;
第一个参数:就是优先队列中存储的数据类型 第二个参数:vector<int> 是用来承载底层数据结构堆的容器,若优先队列中存放的是double型数据,就要填vector< double >,总之存的是什么类型的数据,就相应的填写对应类型。同时也要改动第三个参数里面的对应类型。
less<int> 表示数字大的优先级大,堆顶为最大的数字 greater<int>表示数字小的优先级大,堆顶为最小的数字
如果存储pair 默认先对pair的first进行降序排序,然后再对second降序排序
|
- 访问队头元素 :
q.top()
优先队列只能通过top()访问队首元素(优先级最高的元素)