《数据结构学习与实验指导》4-4:Windows消息队列

来源:互联网 发布:js时间格式化 编辑:程序博客网 时间:2024/05/22 17:04

实验内容:消息队列是Windows系统的基础。对于每个进程,系统维护一个消息队列。如果在进程中有特定事件发生,系统将把这个消息连同其优先级加入到队列中。如果队列不是空的,可以从队列中按照优先级获取消息。
输入格式:输入第1行给出正整数N(N<=10^5)。随后N行,每行给出一个指令——GET或PUT,分别表示从队列中取出消息或将消息添加到队列中。如果指令是PUT,后面就有一个消息名称以及一个正整数,表示优先级,越小表示优先级越高。消息名称是长度不超过10个字符且不含空格的字符串。题目保证队列中消息的优先级无重复,且输入至少有一个GET。
输出格式:对于每个GET指令,在一行中输出消息队列中优先级最高的消息名称和参数。如果消息队列中没有消息,输出“EMPTY QUEUE!”。对于PUT指令没有输出。
测试用例:
输入 | 输出
9 | msg2
PUT msg1 5 | msg3
PUT msg2 4 | msg4
GET | msg1
PUT msg3 2 | EMPTY QUEUE!
PUT msg4 4
GET
GET
GET
GET
1 | EMPTY QUEUE!
GET

#include <stdio.h>#include <stdlib.h>#include <string.h>#define MaxN 100001typedef struct Node {    char arr[11];    int priority;} *PNode;typedef struct Queue {    struct Node command[MaxN];    int size;} *PQueue;int N;PQueue init();void modify(PQueue queue);void add(PQueue queue, char tc[], int ti);int delete(PQueue queue, char result[]);int main() {    PQueue queue = init();    scanf("%d", &N);    char result[11];     char tc[11];    int ti;    int i;    for (i = 0; i < N; i++) {        scanf("%s", tc);        if (strcmp(tc, "PUT") == 0) {            scanf("%s %d", tc, &ti);            add(queue, tc, ti);        } else {            int x = delete(queue, result);            if (x == 0) {                printf("EMPTY QUEUE!\n");            } else {                printf("%s\n", result);            }        }    }    return 0;}PQueue init() {    PQueue queue = (PQueue) malloc(sizeof(struct Queue));    queue->size = 0;    return queue;}void modify(PQueue queue) {    int n = queue->size;    if (n == 1) {        return;    }    int i;    for (i = n / 2; i >= 1; i--) {        int j = i * 2;        if (j + 1 < n) {            if (queue->command[j].priority > queue->command[j + 1].priority) {                j++;            }        }        if (queue->command[i].priority > queue->command[j].priority) {            char tc[11];            int ti;            ti = queue->command[i].priority;            strcpy(tc, queue->command[i].arr);            queue->command[i].priority = queue->command[j].priority;            strcpy(queue->command[i].arr, queue->command[j].arr);            queue->command[j].priority = ti;            strcpy(queue->command[j].arr, tc);        }    }}void add(PQueue queue, char tc[], int ti) {    queue->size ++;    queue->command[queue->size].priority = ti;    strcpy(queue->command[queue->size].arr, tc);    modify(queue);}int delete(PQueue queue, char result[]) {    if (queue->size == 0) {        return 0;    }    strcpy(result, queue->command[1].arr);    strcpy(queue->command[1].arr, queue->command[queue->size].arr);    queue->command[1].priority = queue->command[queue->size].priority;    queue->size--;    modify(queue);    return 1;}
阅读全文
0 0
原创粉丝点击