C语言之环形队列

目录

. 一、环形队列的优势

. 二、环形队列的定义

. 三、环形队列的初始化

. 四、环形队列的入队

. 五、环形队列的出队

. 六、环形队列的查看队首元素

. 七、环形队列的查看队尾元素

. 八、环形队列的判断是否为空

. 九、环形队列的判断是否已满

. 十、环形队列的销毁


. 一、环形队列的优势

        环形队列是一种特殊的队列,它可以解决普通队列在使用时空间利用不充分的问题。在环形队列中,当队列满时,队列的尾指针指向队列的起始位置,而不是指向队列的最后一个元素。这样可以在不浪费空间的情况下存储更多的元素。
        下面我们来详细讲解一下环形队列的实现。

. 二、环形队列的定义

首先,我们需要定义一个环形队列的结构体,包含以下成员变量:

  • int *queue:指向环形队列的指针;
  • int front:指向队列的头部;
  • int rear:指向队列的尾部;
  • int size:队列的容量。
typedef struct {
    int *queue;
    int front;
    int rear;
    int size;
} MyCircularQueue;

. 三、环形队列的初始化

        在初始化环形队列时,我们需要为其动态分配内存空间,并将头指针和尾指针都初始化为-1,表示队列为空。

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue *obj = (MyCircularQueue *)malloc(sizeof(MyCircularQueue));
    obj->queue = (int *)malloc(sizeof(int) * k);
    obj->front = -1;
    obj->rear = -1;
    obj->size = k;
    return obj;
}

. 四、环形队列的入队

        当向队列中插入元素时,我们需要先判断队列是否已满。如果队列已满,则插入失败,返回false;否则,将元素插入到队列的尾部,并将尾指针指向下一个位置。

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if (myCircularQueueIsFull(obj)) {
        return false;
    }
    obj->rear = (obj->rear + 1) % obj->size;
    obj->queue[obj->rear] = value;
    if (obj->front == -1) {
        obj->front = obj->rear;
    }
    return true;
}

. 五、环形队列的出队

        当从队列中删除元素时,我们需要先判断队列是否为空。如果队列为空,则删除失败,返回false;否则,将元素从队列的头部删除,并将头指针指向下一个位置。

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj)) {
        return false;
    }
    if (obj->front == obj->rear) {
        obj->front = -1;
        obj->rear = -1;
        return true;
    }
    obj->front = (obj->front + 1) % obj->size;
    return true;
}

. 六、环形队列的查看队首元素

        当查看队列的头部元素时,我们需要先判断队列是否为空。如果队列为空,则返回-1;否则返回队列头部的元素。

int myCircularQueueFront(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj)) {
        return -1;
    }
    return obj->queue[obj->front];
}

. 七、环形队列的查看队尾元素

        当查看队列的尾部元素时,我们需要先判断队列是否为空。如果队列为空,则返回-1;否则,返回队列尾部的元素。

int myCircularQueueRear(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj)) {
        return -1;
    }
    return obj->queue[obj->rear];
}

. 八、环形队列的判断是否为空

        当判断队列是否为空时,只需要判断头指针是否为-1即可。

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->front == -1;
}

. 九、环形队列的判断是否已满

        当判断队列是否已满时,只需要判断尾指针下一个位置是否为头指针即可。

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->rear + 1) % obj->size == obj->front;
}

. 十、环形队列的销毁

        当环形队列不再使用时,需要释放其占用的内存空间。

void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->queue);
    free(obj);
}

        总的来说,环形队列是一种非常实用的数据结构,特别适用于空间有限的情况下。通过合理的设计和实现,可以使得队列的空间利用率更高,并且操作效率也比较高。


        关于更多嵌入式C语言、FreeRTOS、RT-Thread、Linux应用编程、linux驱动等相关知识,关注公众号【嵌入式Linux知识共享】,后续精彩内容及时收看了解。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值