使用宏实现简单的泛型队列
/*
* Jan. 26, 2019.
*
* Title:
*
* 使用 C99 及宏实现简单的泛型队列。
*
* Demo:
*
* queue_t(int) *fq = new_queue(int, 8);
*
* const int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
* for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
* qput(fq, arr[i]);
*
* for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
* printf("%d, ", qget(fq));
*
* del_queue(fq);
*/
#include <stdio.h>
#include <stdlib.h>
/*
* head, tail 为队列的头、尾索引(data 的索引, data 为一维数组)。
* count 为当前队列的长度(当前队列有多少个元素)。
* length 为队列最大容量(最大能装下多少个元素)。
*/
#define queue_t(type) \
struct \
{ \
size_t head, tail, count, length; \
type *data; \
}
/*
* 创建一个元素为 type 类型,最大长度为 max_length 的队列。
*/
#define new_queue(type, max_length) \
({ \
queue_t(type) *queue = \
(queue_t(type) *)malloc(sizeof(queue_t(type))); \
queue->data = \
(type *)malloc(sizeof(type) * max_length); \
queue->head = 0, queue->tail = 0; \
queue->count = 0, queue->length = max_length; \
queue; \
})
/*
* 删除 queue 队列。
*/
#define del_queue(queue) \
({ \
free(queue->data); \
free(queue); \
})
/*
* 判断 queue 是否为空。
*/
#define qempty(queue) \
({queue->count <= 0 ? 1: 0;})
/*
* 判断 queue 是否已满。
*/
#define qfull(queue) \
({queue->count >= queue->length ? 1: 0;})
/*
* 从 queue 中取出一个元素。
*/
#define qget(queue) \
({ \
size_t index; \
if (!qempty(queue)) \
{ \
index = queue->head; \
queue->head = \
(queue->head + 1) % queue->length; \
queue->count = queue->count - 1; \
} \
queue->data[index]; \
})
/*
* 将一个值为 value 的元素放入 queue 中。
*/
#define qput(queue, value) \
({ \
if (!qfull(queue)) \
{ \
queue->data[queue->tail] = value; \
queue->tail = \
(queue->tail + 1) % queue->length; \
queue->count = queue->count + 1; \
} \
})