C语言模拟消息队列 - 优先级排序与获取

Windows系统为每个进程维护一个消息队列,当发生特定事件时,系统会将对应消息添加到队列中。进程会循环地从队列中按照优先级获取消息,优先级值越低表示优先级越高。

本程序使用C语言模拟了消息队列的功能,允许用户将消息添加到队列中,并根据优先级获取消息。

程序功能

  • 添加消息 (PUT): 向队列中添加一个新的消息,包含消息名称和优先级。
  • 获取消息 (GET): 从队列中获取优先级最高的那个消息,并输出其名称和优先级。如果队列为空,则输出 "EMPTY QUEUE!"。

代码示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NAME_LENGTH 11

typedef struct {
    char name[MAX_NAME_LENGTH];
    int priority;
} Message;

typedef struct {
    Message* messages;
    int size;
} MessageQueue;

void put_message(MessageQueue* queue, const char* name, int priority) {
    Message message;
    strncpy(message.name, name, MAX_NAME_LENGTH);
    message.priority = priority;

    queue->size++;
    queue->messages = realloc(queue->messages, queue->size * sizeof(Message));
    queue->messages[queue->size - 1] = message;
}

void get_message(MessageQueue* queue) {
    if (queue->size == 0) {
        printf("EMPTY QUEUE!
");
        return;
    }

    int max_priority = queue->messages[0].priority;
    int max_index = 0;

    for (int i = 1; i < queue->size; i++) {
        if (queue->messages[i].priority < max_priority) {
            max_priority = queue->messages[i].priority;
            max_index = i;
        }
    }

    Message message = queue->messages[max_index];
    printf("%s %d\n", message.name, message.priority);

    // Remove the message from the queue
    for (int i = max_index; i < queue->size - 1; i++) {
        queue->messages[i] = queue->messages[i + 1];
    }

    queue->size--;
    queue->messages = realloc(queue->messages, queue->size * sizeof(Message));
}

int main() {
    int n;
    scanf("%d", &n);

    MessageQueue queue;
    queue.messages = NULL;
    queue.size = 0;

    char command[4];
    char name[MAX_NAME_LENGTH];
    int priority;

    for (int i = 0; i < n; i++) {
        scanf("%s", command);

        if (strcmp(command, "PUT") == 0) {
            scanf("%s %d", name, &priority);
            put_message(&queue, name, priority);
        } else if (strcmp(command, "GET") == 0) {
            get_message(&queue);
        }
    }

    free(queue.messages);

    return 0;
}

输入格式

输入首先给出正整数N(≤10^5),随后N行,每行给出一个指令——GET或PUT,分别表示从队列中取出消息或将消息添加到队列中。如果指令是PUT,后面就有一个消息名称、以及一个正整数表示消息的优先级,此数越小表示优先级越高。消息名称是长度不超过10个字符且不含空格的字符串;题目保证队列中消息的优先级无重复,且输入至少有一个GET。

输出格式

对于每个GET指令,在一行中输出消息队列中优先级最高的消息的名称和参数。如果消息队列中没有消息,输出EMPTY QUEUE!。对于PUT指令则没有输出。

示例

输入:

5
PUT msg1 10
PUT msg2 5
PUT msg3 1
GET
GET

输出:

msg3 1
msg2 5

编译运行

您可以在任何支持C语言的编译器上编译运行此程序。您需要输入您的指令,程序将根据指令模拟消息队列的操作,并输出结果。

代码解释

代码中使用了以下关键数据结构和函数:

  • Message结构体: 用于存储消息的信息,包括消息名称和优先级。
  • MessageQueue结构体: 用于存储消息队列,包含一个消息数组和一个记录当前消息数量的变量。
  • put_message函数: 用于将消息添加到消息队列中。
  • get_message函数: 用于从消息队列中获取优先级最高的那个消息。

代码首先动态分配了一个消息数组,用于存储消息队列。然后,代码会循环读取用户输入,根据指令执行相应的操作。对于PUT指令,代码会将新的消息添加到队列末尾。对于GET指令,代码会遍历队列,找到优先级最高的那个消息,将其输出并从队列中删除。

本程序演示了如何使用C语言模拟消息队列,并实现了对消息优先级的排序和获取功能。您可以根据需要修改代码,添加其他功能,例如设置消息超时时间等。


原文地址: https://www.cveoy.top/t/topic/moU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录