📅  最后修改于: 2023-12-03 14:40:25.404000             🧑  作者: Mango
模板队列是一种数据结构,它类似于队列(Queue),但允许开发人员在声明队列之前指定队列中存储的元素类型。在C语言中,我们可以使用宏来实现模板队列。
以下是一个使用宏来实现模板队列的示例代码:
#define TEMPLATE_QUEUE(T) \
struct queue_##T { \
T* data; \
int head; \
int tail; \
int size; \
}; \
\
void queue_init_##T(struct queue_##T* queue, int size) { \
queue->data = (T*)malloc(size * sizeof(T)); \
queue->head = 0; \
queue->tail = 0; \
queue->size = size; \
} \
\
void queue_push_##T(struct queue_##T* queue, T value) { \
queue->data[queue->tail++] = value; \
if (queue->tail == queue->size) { \
queue->tail = 0; \
} \
} \
\
T queue_pop_##T(struct queue_##T* queue) { \
T value = queue->data[queue->head++]; \
if (queue->head == queue->size) { \
queue->head = 0; \
} \
return value; \
} \
\
int queue_size_##T(struct queue_##T* queue) { \
if (queue->head <= queue->tail) { \
return queue->tail - queue->head; \
} else { \
return queue->size - queue->head + queue->tail; \
} \
} \
\
void queue_destroy_##T(struct queue_##T* queue) { \
free(queue->data); \
}
使用模板队列的示例代码如下:
#include <stdio.h>
#include <stdlib.h>
// 使用模板队列
TEMPLATE_QUEUE(int);
int main() {
struct queue_int q;
queue_init_int(&q, 5);
queue_push_int(&q, 1);
queue_push_int(&q, 2);
queue_push_int(&q, 3);
printf("Size of queue: %d\n", queue_size_int(&q));
int value = queue_pop_int(&q);
printf("Popped value: %d\n", value);
queue_destroy_int(&q);
return 0;
}
在上面的代码中,我们通过TEMPLATE_QUEUE(int)
宏来声明了一个存储整型值的队列。然后我们可以使用struct queue_int
来定义一个队列的实例,并使用宏定义的函数进行队列操作。
queue_destroy_##T
函数释放内存。只需根据需要修改宏定义的类型参数(T),即可实现其他类型的模板队列。