优先队列的本质其实就是一个堆,一直维护就行。
我们使用C++就可以用STL轻松实现,就不用手写堆了(是不是很方便?(✪ω✪)).
priority_queueq; 默认优先级从到大到小
priority_queue<int,vector,greater > q; 优先级从小到大
当然,我们也可以自定义排序,如下列代码,按照成绩大到小排序,如果成绩相等,就按照名字的字典序,小的排在前面。
#include<bits/stdc++.h>
using namespace std;
struct node //定义学生成员的结构体
{
string name;
float score;
};
bool operator<(const node &a,const node &b) //自定义排序,重载小于符号
{
if(a.score==b.score) return a.name > b.name; //因为对小于符号进行了重载,这里符号与平时相反
else return a.score < b.score; //大到小排
}
priority_queue<node> pq; //优先队列的定义,<>里面为优先队列元素的类型
int main()
{
pq.push({"ar",60}); //传入数据
pq.push({"clc",99});
pq.push({"ph",60});
while(!pq.empty())
{
cout<<pq.top().name<<' '<<pq.top().score<<endl; //打印数据
pq.pop(); //
}
return 0;
}
当然不要忘记,使用c++的优先队列需要加头文件#include<queue>
,使用万能头文件的当我没说(✪ω✪)。
下面是优先队列的基本操作
pq.push(x) //向优先队列pq里面加入x
pq.top() //访问优先队列队首元素(优先级最高的元素)
pq.pop() //删除优先队列队首元素
pq.empty() //查看优先队列是否为空,如果为空返回1
pq.size() //返回优先队列的元素个数