1. 程式人生 > >7-1 Windows訊息佇列 (25 分)

7-1 Windows訊息佇列 (25 分)

軟體學院第十四次訓練


205 分

  1. 程式設計題共 9 小題,共計 205 分

剩餘時間: 693:02:17

剩餘時間: 693:02:17

7-1 Windows訊息佇列 (25 分)

訊息佇列是Windows系統的基礎。對於每個程序,系統維護一個訊息佇列。如果在程序中有特定事件發生,如點選滑鼠、文字改變等,系統將把這個訊息加到隊列當中。同時,如果佇列不是空的,這一程序迴圈地從佇列中按照優先順序獲取訊息。請注意優先順序值低意味著優先順序高。請編輯程式模擬訊息佇列,將訊息加到佇列中以及從佇列中獲取訊息。

輸入格式:

輸入首先給出正整數N(≤10​5​​),隨後N行,每行給出一個指令——GETPUT,分別表示從佇列中取出訊息或將訊息新增到佇列中。如果指令是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;
}