C语言模拟消息队列 - 优先级排序与获取
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 著作权归作者所有。请勿转载和采集!