キューはかなり頻繁に使用されています。これはバックアップです。このコードは人工知能によって書かれています。非常に優れています。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define QUEUE_SIZE 10 // 定义队列的大小
// 定义队列中的元素
typedef struct {
void *data; // 用 void * 存储泛型元素
size_t size; // 存储元素的大小
} QueueElement;
// 定义队列
typedef struct {
QueueElement *elements; // 存储队列中的元素
size_t size; // 存储队列的大小
size_t front; // 存储队列的头
size_t rear; // 存储队列的尾
} Queue;
// 创建队列
Queue *createQueue(size_t size) {
Queue *queue = (Queue *) malloc(sizeof(Queue)); // 为队列分配内存
queue->elements = (QueueElement *) malloc(sizeof(QueueElement) * size); // 为队列中的元素分配内存
queue->size = size; // 存储队列的大小
queue->front = 0; // 初始化队列的头
queue->rear = 0; // 初始化队列的尾
return queue; // 返回队列
}
// 判断队列是否为空
bool isQueueEmpty(Queue *queue) {
return queue->front == queue->rear; // 判断队列的头是否等于队列的尾
}
// 判断队列是否已满
bool isQueueFull(Queue *queue) {
return (queue->rear + 1) % queue->size == queue->front; // 判断队列的尾是否等于队列的头的前一个位置
}
// 入队
bool enqueue(Queue *queue, void *data, size_t size) {
if (isQueueFull(queue)) {
// 判断队列是否已满
return false; // 如果队列已满,返回 false
}
QueueElement *element = &(queue->elements[queue->rear]); // 获取队列的尾元素
element->data = malloc(size); // 为元素的数据分配内存
if (element->data == NULL) {
// 判断内存是否分配成功
return false; // 如果内存分配失败,返回 false
}
element->size = size; // 存储元素的大小
memcpy(element->data, data, size); // 将元素的数据复制到队列中
queue->rear = (queue->rear + 1) % queue->size; // 将队列的尾指针向后移动
return true; // 入队成功,返回 true
}
// 出队
bool dequeue(Queue *queue, void *data, size_t size) {
if (isQueueEmpty(queue)) {
// 判断队列是否为空
return false; // 如果队列为空,返回 false
}
QueueElement *element = &(queue->elements[queue->front]); // 获取队列的头元素
memcpy(data, element->data, size); // 将元素的数据复制到 data 中
free(element->data); // 释放元素的数据的内存
element->data = NULL; // 将元素的数据的指针指向 NULL
element->size = 0; // 将元素的大小设置为 0
queue->front = (queue->front + 1) % queue->size; // 将队列的头指针向后移动
return true; // 出队成功,返回 true
}
// 销毁队列
void destroyQueue(Queue *queue) {
while (!isQueueEmpty(queue)) {
// 循环直到队列为空
QueueElement *element = &(queue->elements[queue->front]); // 获取队列的头元素
free(element->data); // 释放元素的数据的内存
element->data = NULL; // 将元素的数据的指针指向 NULL
element->size = 0; // 将元素的大小设置为 0
queue->front = (queue->front + 1) % queue->size; // 将队列的头指针向后移动
}
free(queue->elements); // 释放队列中元素的内存
queue->elements = NULL; // 将队列中元素的指针指向 NULL
queue->size = 0; // 将队列的大小设置为 0
queue->front = 0; // 将队列的头指针设置为 0
queue->rear = 0; // 将队列的尾指针设置为 0
free(queue); // 释放队列的内存
}
// 示例程序
int main() {
Queue *queue = createQueue(QUEUE_SIZE); // 创建队列
int intData = 1; // 定义 int 类型的数据
enqueue(queue, &intData, sizeof(int)); // 将 int 类型的数据入队
intData = 2; // 定义 int 类型的数据
enqueue(queue, &intData, sizeof(int)); // 将 int 类型的数据入队
intData = 3; // 定义 int 类型的数据
enqueue(queue, &intData, sizeof(int)); // 将 int 类型的数据入队
intData = 0; // 定义 int 类型的数据
while (dequeue(queue, &intData, sizeof(int))) {
// 循环直到队列为空
printf("%d ", intData); // 输出队列中的元素
}
destroyQueue(queue); // 销毁队列
return 0; // 返回 0
}
このサンプル コードでは、キューの要素を格納するために QueueElement を使用し、キューの要素とキューの状態を格納するために Queue を使用する 2 つの構造体を定義します。void *data を使用して汎用要素を保存し、size_t size を使用して要素のサイズを保存します。前後の 2 つのポインタを使用して、キューの先頭と末尾を示します。isQueueEmpty と isQueueFull という 2 つの関数を使用して、キューが空かいっぱいかを判断します。createQueue、enqueue、dequeue、destroyQueue という 4 つの関数を使用して、キューの作成、エンキュー、デキュー、破棄を行います。サンプル プログラムを使用して、キューの使用方法を示しました。