题目大意:
是当输入PUT时,接收一个msg的名称,参数和优先级,将它放在队列尾,当输入GET时,如果队列是空的,输出“EMPTY QUEUE!”,如果非空,输出优先级最高的那条msg的名称和参数(也就是数值最小的),并把它从队列里删除。
解题思路:
1)这道题根据输出中包含“queue”,那么我们可以考虑一下使用queue(队列)来解决这个问题。然而在队列中,要出现后进先出的情况,这时我们便可以考虑使用优先队列来解决这个问题。。。。
2)。在这里,我对这个比较函数有一些自己的看法(可能不正确).其实,return a<b
,这个意思应该是“维持默认的排序方式”,而在一般情况下,默认的排序方式即为升序。而return a > b则表示采用相反于默认排序的方式进行排序。
在优先队列中,默认的排序方式是降序排序。
AC代码如下:
/*
* 1509_1.cpp
*
* Created on: 2013年8月7日
* Author: Administrator
*/
#include <iostream>
#include <queue>
using namespace std;
struct Node{
string name;
int val;
int priority;
int num;
friend bool operator<(Node a , Node b){
if(a.priority != b.priority){
//先输出优先级高的(即priority小的)
return b.priority < a.priority;
}
//用来实现当优先级相同时根据进队顺序输出的功能
return b.num < a.num;
}
};
int main(){
priority_queue<Node> q;
Node cur , next;
string str;
int k = 0;
while(cin >> str){
if( str == "GET"){
if(q.empty()){
cout<<"EMPTY QUEUE!"<<endl;
}else{
cur = q.top();
q.pop();
cout<<cur.name<<" "<<cur.val<<endl;
}
}else{
cin>>next.name>>next.val>>next.priority;
//用来标记进队顺序,先进的num值小
next.num = k++;
q.push(next);
}
}
}