优先队列与队列一样只能队尾进、队首出。但是其排列顺序并不是按入队先后,而是可以自己定义优先级,相当于自动排好序的队列。

基础

 需要的头文件:

1
#include<queue>;

 支持的操作:

1
2
3
4
5
empty()     //判断是否为空
pop() //删除队首元素
push() //队尾加入元素
size() //返回元素个数
top() //返回队首元素

 虽然是叫“优先队列”,但个人感觉比较像栈……

简单元素排序

 元素为数字时,默认按从大到小排。例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
#include<queue>
using namespace std;
int main(){
ios::sync_with_stdio(false);
priority_queue<int> a;
a.push(2);
a.push(1);
a.push(34);
a.push(9999);
a.push(500);
while (!a.empty()){
cout << a.top() << endl;
a.pop();
}
return 0;
}

 输出为:

1
2
3
4
5
9999
500
34
2
1

 如果要按从小到大排,需要将函数声明修改:

1
priority_queue<int,vector<int>,greater<int>> a;

 或者使用自己定义的比较函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>
#include<queue>
using namespace std;
struct cmp1{
bool operator()(int &a,int &b){
return a > b;//最小值优先
}
};

struct cmp2{
bool operator()(int &a,int &b){
return a < b;//最大值优先
}
};
int main(){
ios::sync_with_stdio(false);
priority_queue<int,vector<int>,cmp1> a;
a.push(2);
a.push(1);
a.push(34);
a.push(9999);
a.push(500);
while (!a.empty()){
cout << a.top() << endl;
a.pop();
}
return 0;
}

 同理,对于字符也可以用同样的方法排序。

结构体排序

 对于结构体,需要在结构体定义时定义优先级。例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream>
#include<queue>
using namespace std;
struct node{
//从大到小
friend bool operator< (node a, node b){
return a.priority < b.priority;
}
int priority;
int other;
};
int main(){
ios::sync_with_stdio(false);
priority_queue<node> a;
node now;

now.priority=2;
now.other=1111;
a.push(now);
now.priority=1;
now.other=2222;
a.push(now);
now.priority=34;
now.other=3333;
a.push(now);
now.priority=9999;
now.other=4444;
a.push(now);
now.priority=500;
now.other=5555;
a.push(now);

while (!a.empty()){
cout << a.top().priority << ' ' << a.top().other << endl;
a.pop();
}
return 0;
}

 输出结果为:

1
2
3
4
5
9999 4444
500 5555
34 3333
2 1111
1 2222

 要改变排列顺序,只需要修改一个符号:  return a.priority > b.priority;