消息队列是Windows系统的基础。对于每个进程,系统维护一个消息队列。如果在进程中有特定事件发生,如点击鼠标、文字改变等,系统将把这个消息加到队列当中。同时,如果队列不是空的,这一进程循环地从队列中按照优先级获取消息。请注意优先级值低意味着优先级高。请编辑程序模拟消息队列,将消息加到队列中以及从队列中获取消息。
输入格式:
输入首先给出正整数N(≤105),随后N行,每行给出一个指令——GET 或PUT,分别表示从队列中取出消息或将消息添加到队列中。如果指令是PUT,后面就有一个消息名称、以及一个正整数表示消息的优先级,此数越小表示优先级越高。消息名称是长度不超过10个字符且不含空格的字符串;题目保证队列中消息的优先级无重复,且输入至少有一个GET。
输出格式:
对于每个GET指令,在一行中输出消息队列中优先级最高的消息的名称和参数。如果消息队列中没有消息,输出EMPTY QUEUE!。对于PUT指令则没有输出。
题目思路:
1.这道题目用到STL容器中的Priority_Queue容器,头文件是“queue”,在使用优先队列时,需要对优先队列内元素的优先级进行重新设置。
2.优先级的设置分为基本数据类型(默认数据越大优先级越高)和结构体数据类型(必须对“<”进行重载,规定,对“>”重载编译器报错)。
3.这道题中的结构体中定义一个友元函数 friend operator < (Node a, Node b){return a.num > b.num}(这里不是小于,而是大于号,不懂就暂且先记住,他这里和sort排序我们 自己定义的bool CMP() 的正好相反)。
#include
#include
#include
using namespace std;
struct Node {
string message;
int num;
friend bool operator<(Node a, Node b) {
return a.num > b.num; }
};
int main()
{
priority_queue<Node> que;
Node t;
string st;
int n;
cin >> n;
ios::sync_with_stdio; //这道题对时间的限制比较刁钻,第三个测试点有时过不去,问题不大,加上这句会好些。
for (int i = 0; i < n; i++)
{
cin >> st;
if (st[0] == 'P')
{
cin >> t.message >> t.num;
que.push(t);
}
else
{
if (que.empty())
cout << "EMPTY QUEUE!\n";
else
{
cout << que.top().message << endl;
que.pop();
}
}
}
return 0;
}