优先队列,是堆的数据结构。子节点不大于父节点,根节点为最大值,故取出的是最大值。

 

优先队列,1权值越小优先级高,2权值相等,先输入的优先级高,即索引越小优先级越高。

重载符号:

struct node
{
    char str[100];
    int par;
    int pri;
    int index;
    bool operator<(const node &x) const
    {
        if(pri!=x.pri)
            return pri>x.pri;  //按照pri越小优先级越大
        else
            return index>x.index;//按照索引越小优先级越大
    }
};

代码如下:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string>
 4 #include<string.h>
 5 #include<algorithm>
 6 #include<math.h>
 7 #include<vector>
 8 #include<stack>
 9 #include<queue>
10 
11 using namespace std;
12 struct node
13 {
14     char str[100];
15     int par;
16     int pri;
17     int index;
18     bool operator<(const node &x) const
19     {
20         if(pri!=x.pri)
21             return pri>x.pri;  //按照pri越小优先级越大
22         else
23             return index>x.index;//按照索引越小优先级越大
24     }
25 };
26 
27 
28 int main()
29 {
30     priority_queue<node> que;
31     int k=0;
32     char cmd[4];
33     node  temp;
34     while(cin>>cmd)
35     {
36         if(strcmp(cmd,"GET")==0)
37         {
38             if(!que.empty())
39             {
40                 temp=que.top();
41                 cout<<temp.str<<' '<<temp.par<<endl;
42                 que.pop();
43 
44             }
45             else
46             {
47                 cout<<"EMPTY QUEUE!"<<endl;
48             }
49         }
50         else
51         {
52             cin>>temp.str>>temp.par>>temp.pri;
53             temp.index=++k;
54             que.push(temp);
55         }
56     }
57     return 0 ;
58 }

注意:本题的输入输出

用scanf和cin输入,不能接受空格,tab,回车,换行,遇到则停止输入。

gets(),可以无上限读取,遇到换行符停止。

 

hdu 1873

优先队列为一个数组,而且如果令队列为全局变量,要注意队列清空。如果放在循环体内就不需要清空了。

#include<string>
#include<string.h>
#include<queue>
#include<map>
#include<stack>
#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;
int n;
int i,j;
char str[4];
struct man{
    int id;
    int level;
    bool operator<(const man m) const{     //级别越高,优先级越大, 级别相等则 编号越小优先级越大。
        if(level!=m.level)
            return level<m.level;
        else return id>m.id;
    }
};
priority_queue<man>q[3];  //全局变量,故需要清空

int main()
{
    int id,level,doc;
    man people;
while(cin>>n){
//优先队列数组清空
for(i=0;i<3;i++) while(!q[i].empty()) q[i].pop();
//////////////////// id
=1; while(n--){ cin>>str>>doc; if(!strcmp(str,"IN")) { cin>>people.level; people.id=id++; q[doc-1].push(people); } else{ if(!q[doc-1].empty()){ cout<<q[doc-1].top().id<<endl; q[doc-1].pop(); } else cout<<"EMPTY"<<endl; } if(!strcmp(str,"IN")){ } } } return 0; }