Windows消息队列 (c语言)

题目描述

消息队列是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;
}

猜你喜欢

转载自blog.csdn.net/qq_42819248/article/details/82812013