《ACM程序设计》书中题目 S-19 Message queue

来源:互联网 发布:淘宝主图尺寸750 编辑:程序博客网 时间:2024/06/03 17:38

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

GETPUT msg1 10 5PUT msg2 10 4GETGETGET

Sample Output

EMPTY QUEUE!msg2 10msg1 10EMPTY 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的使用还不是很熟练,需要进一步的练习。

 

0 0
原创粉丝点击