7-26 Windows消息队列 (25 分)
消息队列是Windows系统的基础。对于每个进程,系统维护一个消息队列。如果在进程中有特定事件发生,如点击鼠标、文字改变等,系统将把这个消息加到队列当中。同时,如果队列不是空的,这一进程循环地从队列中按照优先级获取消息。请注意优先级值低意味着优先级高。请编辑程序模拟消息队列,将消息加到队列中以及从队列中获取消息。
输入格式:
输入首先给出正整数$N$(≤105),随后$N$行,每行给出一个指令——GET
或PUT
,分别表示从队列中取出消息或将消息添加到队列中。如果指令是PUT
,后面就有一个消息名称、以及一个正整数表示消息的优先级,此数越小表示优先级越高。消息名称是长度不超过10个字符且不含空格的字符串;题目保证队列中消息的优先级无重复,且输入至少有一个GET
。
输出格式:
对于每个GET
指令,在一行中输出消息队列中优先级最高的消息的名称和参数。如果消息队列中没有消息,输出EMPTY QUEUE!
。对于PUT
指令则没有输出。
输入样例:
1 2 3 4 5 6 7 8 9 10
| 9 PUT msg1 5 PUT msg2 4 GET PUT msg3 2 PUT msg4 4 GET GET GET GET
|
输出样例:
1 2 3 4 5
| msg2 msg3 msg4 msg1 EMPTY QUEUE!
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| #include<stdio.h> #include<stdlib.h> #include<string.h>
typedef struct Node *node; struct Node { char mes[11]; int priority; };
struct { node heap[100005]; int num; } Heap;
void Put(); void Get();
int main() { int n; scanf("%d",&n); Heap.heap[0] = (node)malloc( sizeof(struct Node)); Heap.heap[0]->priority = -1; Heap.num = 0;
while( n--) { char op[4]; getchar(); scanf("%s",op); switch( op[0]) { case 'P' : Put(); break; case 'G' : Get(); break; default : break; } }
return 0; }
void Put() { int i; node temp = ( node ) malloc( sizeof( struct Node)); scanf("%s %d",temp->mes,&temp->priority); for( i=++Heap.num; Heap.heap[i/2]->priority > temp->priority; i=i/2) { Heap.heap[i] = Heap.heap[i/2]; } Heap.heap[i] = temp; }
void Get() { int i;
if( Heap.num<1) { printf("EMPTY QUEUE!\n"); return ; } printf("%s\n",Heap.heap[1]->mes); for( i=1; i*2<Heap.num; ) { if( i*2+1<Heap.num && Heap.heap[i*2+1]->priority<Heap.heap[i*2]->priority) { if( Heap.heap[i*2+1]->priority<Heap.heap[Heap.num]->priority) { Heap.heap[i] = Heap.heap[i*2+1]; i=i*2+1; } else break; } else { if(Heap.heap[i*2]->priority < Heap.heap[Heap.num]->priority) { Heap.heap[i] = Heap.heap[i*2]; i *= 2; } else break; } } Heap.heap[i] = Heap.heap[Heap.num--]; }
|