队列,想必大家都很熟悉,一种先进先出(FIFO)线性表。
那什么是优先队列呢,大家都看过倚天屠龙记吧,最精彩的莫过于六大派围攻光明顶。六大派轮流和明教教主张无忌比武,那到底先派谁呢?当然先派比较厉害的,崆峒五老的七伤拳,一练七伤,七者皆伤,最终不敌张无忌,接下来派出的是少林(摸n)龙抓手,结果也是不敌,最后当属灭绝师太的倚天剑了。
在六大派围攻光明顶中,大家拍着队和张无忌比武,这就是队列,但是还要选择武功较高的,而且越来越高的,这就是优先队列了。在优先队列里,可以自己定义优先级,比如你想让昆仑派先和张无忌比武,就可让昆仑派的优先级最高。
#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int> q1;//默认从大到小
priority_queue <int,vector<int>, greater<int> > q2; //从小到大 greater 越来越大
priority_queue <int,vector<int>, less<int> >q3; //从大到小 less 越来越小
struct node{ //定义一个结构体
int x,y;
bool operator < (const node & a) const //重载运算符
{
return a.x<a.y;
}
};
优先队列在C++的头文件queue里默认优先级从大到小,优先队列是通过堆实现的。
priority_queue <int,vector<int>, greater<int> > q; //从小到大 greater 越来越大 注意最后两个> >之间有空格
priority_queue <int,vector<int>, less<int> >q; //从大到小 less 越来越小
priority_queue <long,vector<long>, less<long> >q; //存放的数据类型为long
优先队列有三个参数,第一个参数是数据类型,第二个参数是存放该数据元素的容器类型,第三个参数是优先级类型。
当然也可以自己定义优先级,通过重载运算符,重载运算符时,通过const常量和结构体中的变量进行比较,你要定义那种优先级,让return返回1即可。
好了 ,知道了这些我们来看看hdu1509 Windows Message Queue
题意:在计算机处理中,任务会排队处理,先处理优先级高的,如果优先级一样高就先处理先入队的。输入"PUT"将msg加入队尾,输入"GET"获取优先级最高的任务,如果没有就输出“EMPTY QUEUE!”。
题解:我们可以直接用优先队列来模拟一遍,注意优先级一样时的处理,我们可以设置一个变量time来记录每条记录入队的时间。
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct node{
char a[10];
int x;
int y;
int time;
bool operator < (const node& t) const
{
return t.y<y||(y==t.y&&t.time<time); //如果优先级一样 先入队列的先出 即时间小的先出
}
};
priority_queue< node >pq;
int main()
{
char s1[10];
struct node t;
int ans=1;
while(scanf("%s",s1)==1){
if(!strcmp(s1,"PUT")){
scanf("%s %d %d",t.a,&t.x,&t.y);
t.time=ans++;
pq.push(t);
}
else {
if(!pq.empty()) {
printf("%s %d\n",(pq.top()).a,(pq.top()).x);
pq.pop();
}
else printf("EMPTY QUEUE!\n");
}
}
return 0;
}