1. 程式人生 > >PTA-資料結構 5-26 Windows訊息佇列 (25分)

PTA-資料結構 5-26 Windows訊息佇列 (25分)

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

輸入格式:

輸入首先給出正整數N(\le 10^5105),隨後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 <string.h>
#include <iostream>
#include <queue>

using namespace std;

typedef struct MSG {
    friend bool operator< ( MSG n1, MSG n2) {
        return n1.rank > n2.rank;  //"<"為從大到小排列,">"為從小到大排列
    }
    char msg[15];
    int rank;
} MSG;



//priority_queue<MSG, vector<MSG>, cmp > q;
priority_queue<MSG> q;

int main() {
    //freopen( "123.txt", "r", stdin );
    int n;

    scanf( "%d", &n );

    MSG m;
    char op[15];

    for( int i = 0; i < n; i++ ) {
        scanf( "%s", op );
        if( !strcmp( op, "PUT" ) ) {
            scanf( "%s%d", m.msg, &m.rank );
            q.push( m );
        }
        else if( !strcmp( op, "GET" ) ) {
            if( q.empty() ) {
                printf( "EMPTY QUEUE!\n" );
            }
            else {
                MSG cur = q.top();
                printf( "%s\n", cur.msg );
                q.pop();
            }
        }
    }
    return 0;
}