使用宏实现简单的泛型队列

使用宏实现简单的泛型队列

/*
 *  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;                    \
    }                                                       \
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值