Description
Message queue is the basic fundamental of windows system. For each process, the system maintains a message queue. If something happens to this process, such as mouse click, text change, the system will add a message to the queue. Meanwhile, the process will do a loop for getting message from the queue according to the priority value if it is not empty. Note that the less priority value means the higher priority. In this problem, you are asked to simulate the message queue for putting messages to and getting message from the message queue.
Input
There's only one test case in the input. Each line is a command, "GET" or "PUT", which means getting message or putting message. If the command is "PUT", there're one string means the message name and two integer means the parameter and priority followed by. There will be at most 60000 command. Note that one message can appear twice or more and if two messages have the same priority, the one comes first will be processed first.(i.e., FIFO for the same priority.) Process to the end-of-file.
Output
For each "GET" command, output the command getting from the message queue with the name and parameter in one line. If there's no message in the queue, output "EMPTY QUEUE!". There's no output for "PUT" command.
Sample Input
GET PUT msg1 10 5 PUT msg2 10 4 GET GET GET
Sample Output
EMPTY QUEUE! msg2 10 msg1 10 EMPTY QUEUE!
这道题的基本题意为输入PUT,输入数据;输入GET,输出一个优先级最高(先按第三个数据排序,如果相同按第一个数据排序)的数据,并移除该数据,如果没有数据可以输出则输出EMPTY QUEUE!
基本思路为定义一个结构体,并重新定义小于号,然后用该结构体的优先队列的相关操作完成输出。
源代码如下:
#include<bits/stdc++.h>
using namespace std;
struct shu
{ string a;
int b,c;
const bool operator<(const shu &d)const
{
if(c!=d.c)return c>d.c;
return a>d.a;
}
};
int main()
{ priority_queue<shu>s;
shu p;
string n,x;
int y,z;
while(cin>>n)
{
if(n=="GET"&&s.empty())cout<<"EMPTY QUEUE!"<<endl;
if(n=="GET"&&s.empty()!=1)
{
cout<<s.top().a<<" "<<s.top().b<<endl;
s.pop();
}
if(n=="PUT")
{ cin>>x>>y>>z;
p.a=x;
p.b=y;
p.c=z;
s.push(p);
}
}
}
思路不是太难,但是需要用到优先队列的很多知识,对STL的使用还不是很熟练,需要进一步的练习。