消息队列是 Windows 操作系统的基石。对于每个进程,系统维持了一个消息队列。如
果一个进程发生了某一事件,如单击鼠标,文本改变,系统将增加一个消息到队列里。同
时,如果队列里不是空的,那么,进程将一直循环地从队列里按优先值抓取消息。注意,
数值小意味着高的优先级。在本题中,要求你模拟消息队列,把消息放到消息队列中,或
从消息队列里抓取消息。
2.输入描述
只有一个测试案例。每行是一条命令,“GET”或“PUT”表示从消息队列里抓取消
息或把消息放入消息队列。如果是“
PUT”命令,后面跟着一个字符串(表示消息名称)
和两个整数(分别表示消息的参数和该消息的优先级)。案例中的命令最多达
60 000 条。
注意,一条命令可以重复出现多次,如果两条消息的优先级相同,先进入消息队列的那条
先被处理。(优先级相同的命令,是先进先出的。)一直处理到文件结尾。
3.输出描述
对于每条“GET”命令,直接输出它抓取的消息的名称和参数在一行上。如果消息队
列是空的,那么直接输出“EMPTY QUEUE!”。对于“PUT”命令,不需要输出什么。
4.输入样例
GET
PUT msg1 10 5
PUT msg2 10 4
GET
GET
GET
5.输出样例
EMPTY QUEUE!
msg2 10
msg1 10
EMPTY QUEUE!
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
struct task
{
string content;
int data;
int priority;
bool operator < (const task &t)const
{
return t.priority < priority;
}
};
priority_queue<task>v;
int _tmain(int argc, _TCHAR* argv[])
{
ifstream in("D:\\visual studio 2013 code\\test.txt");
ofstream out("D:\\visual studio 2013 code\\out.txt");
string str1,str2;
char temp[80];
task t1;
//vector<string>str_v;
//vector<string>::iterator str_it;
while (in >> str1)
{
//str_it = str_v.begin();
if (str1 == "GET"&&v.size()==0)
{
cout << "EMPTY QUEUE!" << endl;
}
else if (str1 == "GET")
{
cout << v.top().content<<" "<<v.top().data << endl;
v.pop();
}
else if (str1 == "PUT")
{
//in.getline(temp,80);
//str2 = temp;
//cout << str2<<endl;
in >> t1.content >>t1.data >> t1.priority;
v.push(t1);
}
}
return 0;
}