題目來源:
點擊打開鏈接
題目翻譯:
消息隊列是windows系統的基本基礎。對於每個進程,系統都維護一個消息隊列。如果這個過程發生某些事情,例如鼠標點擊,文本改變,系統會向隊列添加一條消息。同時,如果不是空的,該過程將根據優先級值從隊列中獲取消息。請注意,優先級越低意味着優先級越高。在這個問題中,系統會要求您模擬消息隊列,以便將消息放入消息隊列並從中獲取消息。
輸出:對於每個“GET”命令,輸出從消息隊列中獲取的命令,其名稱和參數在一行中。如果隊列中沒有消息,請輸出“EMPTY QUEUE!”。 “PUT”命令沒有輸出。
例子:
(輸入)
GET
PUT msg1 10 5
PUT msg2 10 4
GET
GET
GET
(輸出)
EMPTY QUEUE!
msg2 10
msg1 10
EMPTY QUEUE!
解題:
我的思路是,定義一個信息結構,每個信息點包括信息的名字、信息的參數、信息的優先級以及信息的請求順序。
加上信息的請求順序主要是爲了區別同一優先級的信息的先後處理順序。然後把信息點放到一個優先隊列中,優
先隊列的先後順序爲:優先級越低越重要,同一優先級的話,信息請求順序越前越重要。遇到put就進隊列,遇
到get,就判斷隊列是否爲空,若不空則出隊輸出,若空就打印爲空。具體看代碼:
/*
c++/accepted
*/
#include<iostream>
#include<queue>
#include<string>
using namespace std;
struct node { //定義信息點結構
int n, p, num; //n爲參數,p爲優先級,num爲輸入順序
string s;
bool friend operator < (node a, node b) { //定義信息點的大小函數
if (a.p == b.p) //優先級相等,就比較輸入順序
return a.n > b.n;
return a.p > b.p; //優先級不等,就比較優先級
}
}an;
int main() {
string ss;
priority_queue<node> q;
int k = 1;
while (cin>>ss) {
if (ss[0] == 'G') { //爲get則拿信息
if (q.empty()) {//判斷隊列是否爲空
cout<<"EMPTY QUEUE!"<<endl;
}
else {
an = q.top();
cout << an.s << " " << an.num << endl;
q.pop();
}
}
else { //存信息
cin >> an.s;
cin >> an.num;
cin >> an.p;
an.n = k;
k++;
q.push(an);
}
}
return 0;
}