案例4-4 Windows消息队列 (25 分)(优先队列的优先级设定)

消息队列是Windows系统的基础。对于每个进程,系统维护一个消息队列。如果在进程中有特定事件发生,如点击鼠标、文字改变等,系统将把这个消息加到队列当中。同时,如果队列不是空的,这一进程循环地从队列中按照优先级获取消息。请注意优先级值低意味着优先级高。请编辑程序模拟消息队列,将消息加到队列中以及从队列中获取消息。

输入格式:
输入首先给出正整数N(≤10​5​​),随后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;
}

你可能感兴趣的:(PAT,天梯赛,stl,数据结构)