//priority_queue 的基本函数
首先 在优先队列中 所有的元素自动排序,采用堆的方式 时间复杂度为O logN;
push() 入队操作
top() 获得队首元素 一般是最大或者最小 优先级最高的
pop() 出队操作 就是弹出队首
empty() 判断是否空
size() 返回大小
-
重载 “<” 的语义:当优先级相等时,先到的优先级高,不能指望 priority_queue 自动将先到但优先级相等的病人排在前面
-
由于每组数据处理完之后,队列并没有 pop 空,但 priority_queue 又没有提供清空队列的方法,所以只能每组数据都重新创建对象
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<math.h>
#include<map>
#include<queue>
using namespace std;
struct patient{
int id;
int value;
friend bool operator<(patient a,patient b){//重载"<"操作符,指定优先规则,只能是 <
if(a.value!=b.value)
return a.value<b.value;//先比较value,由大到小排序
return a.id>b.id;
}
}hhh;
int main()
{
int n;
string s;
while(cin>>n)
{
priority_queue<patient> drocter1;//定义结构体类型的优先队列,优先队列默认元素的从大到小 排列 (降序排列)
priority_queue<patient> drocter2;
priority_queue<patient> drocter3;
int count=0;
while(n--)
{
cin>>s;
int a,b;
if(s=="IN")
{
count++;
cin>>a>>b;
hhh.id=count;
hhh.value=b;
if(a==1)
drocter1.push(hhh);//把整个结构体内容插入队列
else if(a==2)
drocter2.push(hhh);
else if(a==3)
drocter3.push(hhh);
}
else if(s=="OUT")
{
cin>>a;
if(a==1)
{
if(drocter1.empty())
cout<<"EMPTY"<<endl;
else
{
cout<<drocter1.top().id<<endl;
drocter1.pop();//数据弹出
}
}
else if(a==2)
{
if(drocter2.empty())
cout<<"EMPTY"<<endl;
else
{
cout<<drocter2.top().id<<endl;
drocter2.pop();
}
}
else if(a==3)
{
if(drocter3.empty())
cout<<"EMPTY"<<endl;
else
{
cout<<drocter3.top().id<<endl;
drocter3.pop();
}
}
}
}
}
return 0;
}