7-1 Windows訊息佇列 (25 分)
阿新 • • 發佈:2018-12-08
軟體學院第十四次訓練
205 分
- 程式設計題共 9 小題,共計 205 分
剩餘時間: 693:02:17
剩餘時間: 693:02:17
7-1 Windows訊息佇列 (25 分)
訊息佇列是Windows系統的基礎。對於每個程序,系統維護一個訊息佇列。如果在程序中有特定事件發生,如點選滑鼠、文字改變等,系統將把這個訊息加到隊列當中。同時,如果佇列不是空的,這一程序迴圈地從佇列中按照優先順序獲取訊息。請注意優先順序值低意味著優先順序高。請編輯程式模擬訊息佇列,將訊息加到佇列中以及從佇列中獲取訊息。
輸入格式:
輸入首先給出正整數N(≤105),隨後N行,每行給出一個指令——GET
或PUT
,分別表示從佇列中取出訊息或將訊息新增到佇列中。如果指令是PUT
,後面就有一個訊息名稱、以及一個正整數表示訊息的優先順序,此數越小表示優先順序越高。訊息名稱是長度不超過10個字元且不含空格的字串;題目保證佇列中訊息的優先順序無重複,且輸入至少有一個GET
。
輸出格式:
對於每個GET
指令,在一行中輸出訊息佇列中優先順序最高的訊息的名稱和引數。如果訊息佇列中沒有訊息,輸出EMPTY QUEUE!
。對於PUT
指令則沒有輸出。
輸入樣例:
9 PUT msg1 5 PUT msg2 4 GET PUT msg3 2 PUT msg4 4 GET GET GET GET
輸出樣例:
msg2
msg3
msg4
msg1
EMPTY QUEUE!
#include<iostream> #include<queue> using namespace std; struct node{ char name[15]; int rank; bool operator <(const node x) const{ return rank>x.rank; }//這樣較大的值就會被優先佇列認為是較小的值,從而實現從小到大排序 }w; //sort預設為從小到大排序,優先佇列預設為從大到小。 int main(){ priority_queue<node>q; int n; cin>>n; char str[6]; while(n--){ scanf("%s",str); if(str[0]=='P'){ scanf("%s %d",&w.name,&w.rank); q.push(w); }else{ if(q.empty()){ printf("EMPTY QUEUE!\n"); }else{ w=q.top();q.pop(); printf("%s\n",w.name); } } } return 0; }