数据结构(10)---队列之环形队列

本文介绍了环形队列的数据结构及其在固定容量场景下的工作原理,包括两种常见的C++实现方式,重点讲解了队列操作的逻辑和边界处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环形队列



什么是环形队列

在这里插入图片描述

环形队列也是队列的一种数据结构, 也是在队头出队, 队尾入队;
只是环形队列的大小是确定的, 不能进行一个长度的增加, 当你把一个环形队列创建好之后, 它能存放的元素个数是确定的;
一般我们实现这个环形队列是通过一个连续的结构来实现的;
虽然环形队列在逻辑上是环形的, 但在物理上是一个定长的数组;
那如何在逻辑上形成一个环形的变化, 主要是在头尾指针当走到连续空间的末尾的时候, 它会做一个重置的操作
在这里插入图片描述

循环队列的实现

第一种实现

typedef struct {
    //第一种实现:
    int* _data;
    //第一个元素的位置: 队头位置
    int _front;
    //最后一个元素的下一个位置
    int _rear;
    int _k;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
    //多开一个元素的空间
    MyCircularQueue* mq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    mq->_data = (int*)malloc(sizeof(int) * (k + 1));
    mq->_front = mq->_rear = 0;
    mq->_k = k;
    return mq;
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    if(obj->_front == obj->_rear)
        return true;
    else
        return false;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    if((obj->_rear + 1) % (obj->_k + 1) == obj->_front)
        return true;
    else
        return false;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    //判断队列是否已满
    if(myCircularQueueIsFull(obj))
        return false;
    obj->_data[obj->_rear++] = value;
    //判断队尾是否越界
    if(obj->_rear > obj->_k)
        obj->_rear = 0;
    return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    //判断队列是否为空
    if(myCircularQueueIsEmpty(obj))
        return false;
    //出队
    obj->_front++;
    //判断队头是否越界
    if(obj->_front > obj->_k)
        obj->_front = 0;
    return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->_data[obj->_front];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    //返回队尾rear的前一个位置的元素
    //判断rear是否为0;
    if(obj->_rear != 0)
        return obj->_data[obj->_rear - 1];
    else
        return obj->_data[obj->_k];
}

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

第二种实现

typedef struct {
    //第一种实现:
    int* _data;
    //第一个元素的位置: 队头位置
    int _front;
    //最后一个元素的下一个位置
    int _rear;
    int _k;
    int _size;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
    //多开一个元素的空间
    MyCircularQueue* mq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    mq->_data = (int*)malloc(sizeof(int) * k);
    mq->_front = mq->_rear = 0;
    mq->_k = k;
    mq->_size = 0;
    return mq;
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    if(obj->_size == 0)
        return true;
    else
        return false;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    if(obj->_size == obj->_k)
        return true;
    else
        return false;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    //判断队列是否已满
    if(myCircularQueueIsFull(obj))
        return false;
    obj->_data[obj->_rear++] = value;
    //判断队尾是否越界
    if(obj->_rear >= obj->_k)
        obj->_rear = 0;
    ++obj->_size;
    return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    //判断队列是否为空
    if(myCircularQueueIsEmpty(obj))
        return false;
    //出队
    obj->_front++;
    //判断队头是否越界
    if(obj->_front >= obj->_k)
        obj->_front = 0;
    --obj->_size;
    return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->_data[obj->_front];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    //返回队尾rear的前一个位置的元素
    //判断rear是否为0;
    if(obj->_rear != 0)
        return obj->_data[obj->_rear - 1];
    else
        return obj->_data[obj->_k - 1];
}

void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->_data);
    free(obj);
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李憨憨_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值