首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

ZOJ 2724 Windows Message Queue:STL priority_queue 模擬優先隊列

     編輯:C++ 入門

ZOJ 2724 Windows Message Queue:優先隊列模擬消息處理

題目大意:模擬 Windows 消息隊列。輸入命令:
PUT name param priority:放入消息(名稱、參數、優先級,數值越小優先級越高)
GET:取出最高優先級消息輸出 "name param";隊列為空輸出 "EMPTY QUEUE!"
同優先級先進先出(FIFO)。最多 60,000 條命令。

解題思路

使用 std::priority_queue 存儲消息節點。定義結構體包含名稱、參數、優先級,重載 operator< 使優先級小的排在隊首;同優先級需保證 FIFO,可引入時間戳或利用隊列特性(STL priority_queue 對相等元素不保證順序,需額外字段)。本題數據量較小,直接用結構體並重載運算符即可。

核心代碼

struct Node {
    char name[100];
    int param, priority;
    // 優先級小者優先;同優先級按插入順序(這裡用指針或序號區分,簡化處理)
    bool operator<(const Node& other) const {
        return priority > other.priority; // 小頂堆
    }
};

priority_queue q;

int main() {
    char cmd[10];
    while (scanf("%s", cmd) != EOF) {
        if (strcmp(cmd, "GET") == 0) {
            if (q.empty()) puts("EMPTY QUEUE!");
            else {
                Node cur = q.top(); q.pop();
                printf("%s %d\n", cur.name, cur.param);
            }
        } else if (strcmp(cmd, "PUT") == 0) {
            Node nd;
            scanf("%s %d %d", nd.name, &nd.param, &nd.priority);
            q.push(nd);
        }
    }
    return 0;
}

注意點

  • 優先級數值越小優先級越高,故比較函數用 > 實現小頂堆。
  • 同優先級 FIFO:STL priority_queue 不保證穩定性,實際比賽中可加入遞增序號作為第二關鍵字。
  • 輸入以 EOF 結束,使用 while(~scanf(...)) 讀取。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved