1、 优先队列是一种特殊的队列,这种队列会自动的把队列里的数排序(默认从大到小,使用“<”判断),而且还可以把数按照特定的方法排列!(包括结构体和重载"<")
2、 优先队列的头文件,需要包括:
#include
using namespace std;
声明: 一个优先队列声明的基本格式是:
priority_queue<结构类型> 队列名;
比如:
priority_queue i;
priority_queue d;
不过,我们最为常用的是这几种:
priority_queue q;
//node是一个结构体
//结构体里重载了‘<’小于符号
priority_queue ,greater > q; // 从小到大排序(数组)
priority_queue ,less >q; // 从大到小排序
//不需要#include头文件
//注意后面两个“>”不要写在一起,“>>”是右移运算符
1、以一个名为q的优先队列为例:
q.size(); //返回q里元素个数
q.empty(); //返回q是否为空,空则返回1,否则返回0
q.push(k); //在q的末尾插入k
q.pop(); //删掉q的第一个元素
q.top(); //返回q的第一个元素
q.back(); //返回q的末尾元素
2、优先队列的特性
自动排序。
怎么个排法呢? 在这里介绍一下:
(1)、默认的优先队列(非结构体结构)
priority_queue q;
简单操作:
#include
#include
using namespace std;
priority_queue q;
int main()
{
q.push(10),q.push(8),q.push(12),q.push(14),q.push(6);
while(!q.empty())
printf("%d ",q.top()),q.pop();
}
程序大意就是在这个优先队列里依次插入10、8、12、14、6,再输出。
结果是什么呢?
14 12 10 8 6
也就是说,它是按从大到小排序的!
(2)、默认的优先队列(结构体,重载小于)
先看看这个结构体是什么。
struct node
{
int x,y;
bool operator < (const node & a) const
{
return x
这个node结构体有两个成员,x和y,它的小于规则是x小者小。
再来看看验证程序:
#include
#include
using namespace std;
struct node
{
int x,y;
bool operator < (const node & a) const
{
return x q;
int main()
{
k.x=10,k.y=100; q.push(k);
k.x=12,k.y=60; q.push(k);
k.x=14,k.y=40; q.push(k);
k.x=6,k.y=80; q.push(k);
k.x=8,k.y=20; q.push(k);
while(!q.empty())
{
node m=q.top(); q.pop();
printf("(%d,%d) ",m.x,m.y);
}
}
(3)、less和greater优先队列(多使用这一个)
还是以int为例,先来声明:
priority_queue ,less > p; // 数组从大到小排序
priority_queue ,greater > q; // 从小到大排序
CODE:
#include
#include
using namespace std;
priority_queue ,less > p;
priority_queue ,greater > q;
int a[5]={10,12,14,6,8};
int main()
{
for(int i=0;i<5;i++)
p.push(a[i]),q.push(a[i]);
printf("less:")
while(!p.empty())
printf("%d ",p.top()),p.pop();
pritntf("\ngreater:")
while(!q.empty())
printf("%d ",q.top()),q.pop();
}
结果:
less:14 12 10 8 6
greater:6 8 10 12 14
所以,我们可以知道,less是从大到小,greater是从小到大。