【HDU 1509】 Windows Message Queue 优先队列

队列,想必大家都很熟悉,一种先进先出(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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值