Windows訊息佇列 (c語言)
阿新 • • 發佈:2018-12-11
題目描述
訊息佇列是Windows系統的基礎。對於每個程序,系統維護一個訊息佇列。如果在程序中有特定事件發生,如點選滑鼠、文字改變等,系統將把這個訊息加到隊列當中。同時,如果佇列不是空的,這一程序迴圈地從佇列中按照優先順序獲取訊息。請注意優先順序值低意味著優先順序高。請編輯程式模擬訊息佇列,將訊息加到佇列中以及從佇列中獲取訊息。
輸入描述
輸入首先給出正整數N(≤10^5),隨後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<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node* List; struct node { int data; char a[15]; struct node *next; }; List Insert(List head, char b[], int x) { List r, q; List p = (List)malloc(sizeof(struct node)); strcpy(p->a, b); p->data = x; r = head; if(head->next == NULL) { r->next = p; p->next = NULL; } else { q = r; r = r->next; while(r->next != NULL && r->data > x) { q = r; r = r->next; } if(r->data < x) { if(r->next == NULL) { r->next = p; p->next = NULL; } else { q = r; r = r->next; p->next = r; q->next = p; } } else { p->next = r; q->next = p; } } return head; } List Delete(List head) { List ptr; ptr = head; if(head->next == NULL) { printf("EMPTY QUEUE!\n"); return head; } head = head->next; free(ptr); printf("%s\n", head->a); return head; } int main() { List head; head = (List)malloc(sizeof(struct node)); head->next = NULL; int n,x; char s[5]; char b[15]; scanf("%d", &n); int i; for(i = 0; i < n; i++) { scanf("%s", s); if(strcmp(s, "PUT") == 0) { scanf("%s %d", b, &x); head = Insert(head, b, x); } else { head = Delete(head); } } return 0; }