今天遇到一道题,感觉用优先队列写要简单很多,就来写一下关于优先队列。
默认优先级
队列是先进先出,优先队列则不同,进的顺序不能决定出的顺序。优先队列的顺序是按照自己设置的优先等级来出队的,如果自己不设置优先级的话,默认越大为优先级越高,优先级最高的先出队。
优先队列在头文件queue中
声明格式:priority_queue< int > que;
声明一个名为que的整型的优先队列
基本函数操作
empty() //判断一个队列是否为空
pop() //删除队顶元素
push() //加入一个元素
size() //返回优先队列中拥有的元素个数
top() //返回优先队列中的队顶元素
#include<iostream>
#include<queue>
using namespace std;
priority_queue<int> que;
int main()
{
que.push(1);
que.push(3);
que.push(5);
que.push(4);
que.push(2);
while(!que.empty())
{
cout << que.top() << endl;
que.pop();
}
return 0;
}
自定义优先级
头文件:queue vector
1、int型
priority_queue<int,vector< int >,greater< int > >que;
输出结果从小到大
priority_queue<int,vector< int >less< int > >que;
输出结果从大到小
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int main()
{
priority_queue<int,vector<int>,less<int> >que1;//输出结果从大到小排序
priority_queue<int,vector<int>,greater<int> >que2;//输出结果从小到大排序
que1.push(2);//加入元素
que1.push(1);
que1.push(5);
que2.push(8);
que2.push(4);
que2.push(9);
while(!que1.empty())//判断是否为空,空时结束循环
{
cout << que1.top() << endl;//输出队顶元素
que1.pop();//删除队顶元素
}
while(!que2.empty())
{
cout << que2.top() << endl;
que2.pop();
}
printf("\n");
return 0;
}
2、结构体型(和sort结构体排序的cmp类似)
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int n,m;
friend bool operator< (const node &a,const node &b)
{
if(a.m != b.m)
return a.m > b.m;//m的最小值优先,大于号表示最小值优先
return a.n < b.n;//n的最大值优先,小于号表示最大值优先
}
}N[1000];
int main()
{
priority_queue<node> que;
for(int i=0;i<6;i++)
{
cin >> N[i].n >> N[i].m;
que.push(N[i]);
}
while(!que.empty())
{
cout << que.top().n << que.top().m << endl;
que.pop();
}
while(!que.empty()) que.pop();
return 0;
}