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

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

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

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

輸入格式:

輸入首先給出正整數N(105),隨後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!
作者: DS課程組 單位: 浙江大學 時間限制: 150ms 記憶體限制: 64MB 程式碼長度限制: 16KB

思路:

    看資料量和時間,就知道必須得用優先佇列。。。。。。      優先佇列還不夠熟練,len 初始化一開始想著因為tree[0]不使用,就把len初始為1,然後。。。。。調了去一兩個小時bug。。。然後看著模板改對了。。。。

程式碼:

#include
using namespace std;
struct Node
{
    char s[12];
    int num;
};
int len = 0;//用於記載最小堆的元素量 
Node tree[100005];//儲存最小堆的tree陣列
void Swap_(int a, int b)//輸入兩個tree陣列的下標,交換兩個空間的Node元素
{
    char s1[12];
    strcpy(s1,tree[a].s);
    strcpy(tree[a].s, tree[b].s);
    strcpy(tree[b].s, s1);
    int t = tree[a].num ;
    tree[a].num = tree[b].num;
    tree[b].num = t;
    return ;
}
void DeleteTop()//  輸出,並刪除頂端元素, 把最後堆的一個元素移到頂端,再向下梳理
{
    if(len == 0)
        printf("EMPTY QUEUE!\n");
    else
    {
        printf("%s\n",tree[1].s);
        strcpy(tree[1].s ,tree[len ].s);
        tree[1].num = tree[len].num;
        --len;
        int i = 1;
        while( i*2 <= len)
        {
            int t = i,min_num = tree[i].num ;
            if( tree[i*2].num < min_num )
                {
                    t = i*2;
                    min_num = tree[t].num;
                }
            if((i*2+1 <= len)&&tree[i*2 +1].num  tree[i].num)
                Swap_(i,i/2);
        else flag = 1;
                i /= 2;
    }
    return ;
}
int main()
{
    int n;
    char cmd[6],name[12];
    int num;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",cmd);
        if(cmd[0]== 'G')
        DeleteTop();
        if(cmd[0]== 'P')
        {
            scanf("%s",name);
            scanf("%d",&num);
            Insert(name,num);
        }
    }
    return 0;
}