訊息佇列是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<iostream>
#include<queue>
#include<string>
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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/262585.html
標籤:其他
上一篇:什么是 Skia ?
