队列

队列

元素先进先出,从队尾入队,从队首出队。只允许在最后面添加元素,只允许在最前面删除元素。

queue

  1. 初始化队列
    queue<int> q
  2. 返回队首和队尾元素
    q.front() q.back()
  3. 尾部增加和删除一个元素
    q.push() q.pop()
  4. 队列长度和是否为空
    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]; //队列数组
//队列区间为[hh,tt]
int hh = 0; tt = -1; //队头和队尾指针

初始时tt = -1,队列为空,当 ++tt 之后 tt = hh = 0,给q[0]赋值,hh指向该队头元素

之后新元素入队,++tt往后移,元素出队,hh++,队头指针往后移。队列区间为[hh,tt]

q[++tt] = {} //入队

hh ++ //出队,队首向后移动一格(本来指向队头元素,)

q[hh] //取队头元素

//是否为空的判断,因为队列区间为[hh,tt],当hh <= tt 时代表队列中有元素为非空
while(hh <= tt){

}

priority_queue(优先队列)

优先队列是在正常队列的基础上加了优先级,保证每次的队首元素都是优先级最大的。底层是通过堆(小根堆、大根堆)来实现的。

  1. 初始化
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降序排序
  1. 访问队头元素 : q.top()
    优先队列只能通过top()访问队首元素(优先级最高的元素)

队列
https://cs-lb.github.io/2024/04/04/数据结构/队列/
作者
Liu Bo
发布于
2024年4月4日
许可协议