设计环形队列

文章详细介绍了循环队列的设计,包括如何处理队列空满状态的判断,以及出队操作的实现。通过使用一个额外的空间,使得在长度为k的队列中可以正确判断队列是否为空或已满。此外,文中还提供了enqueue和dequeue的具体实现,以及获取队头和队尾元素的方法。
摘要由CSDN通过智能技术生成


在这里插入图片描述

1.思路分析

1.1队列空满分析

在这里插入图片描述
首先我们假设一个长度为4的环形队列
队头front
队尾rear
当队列为空时
front=rear
当队列满时
front=rear
所以我们无法判断队列是满的或者空的
因此我们多加入一个空间使队列长度为5,我们使real的值为队尾的下一个下标
在这里插入图片描述

这种情况下
当队列为空时
front=rear
当队列满时
real+1=front
这样我们就有了判断空满的能力
但是
在这里插入图片描述
这种情况下显然是满了但是
rear+1=5
front=0
显然不相等
所以我们需要改进
判断满的条件为(rear+1)%(k+1)
进而推出下标在循环里的判断方式
(real/front)%(k+1)

1.2出队分析

出队
出头

return obj->a[obj->front];

出尾
出尾我们要给real-1
在这里插入图片描述

当然还有特殊情况
在这里插入图片描述
这种我们没办法-1,所以要改变我们的判定方式为
(rear+k)%(k+1)

return obj->a[(obj->rear+obj->k)%(obj->k+1)];



总结
当然上述方法也可以单把特殊情况拿出来写,我这里就不写了

2.循环队列设计

typedef struct {
    int *a;
    int front;
    int rear;
    int k;

} MyCircularQueue;

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    assert(obj);
    return obj->front==obj->rear;

}

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

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

}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    assert(obj);
    if(myCircularQueueIsFull(obj))
    return false;
    else
    obj->a[obj->rear++]=value;
    obj->rear%=obj->k+1;
    return true;

    

}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    assert(obj);
    if(myCircularQueueIsEmpty(obj))
    return false;
    else
    obj->front++;
    obj->front%=obj->k+1;
    return true;

}

int myCircularQueueFront(MyCircularQueue* obj) {
    assert(obj);
    if(myCircularQueueIsEmpty(obj))
    return -1;
    else
    return obj->a[obj->front];

}

int myCircularQueueRear(MyCircularQueue* obj) {
    assert(obj);
    if(myCircularQueueIsEmpty(obj))
    return -1;
    else
    return obj->a[(obj->rear+obj->k)%(obj->k+1)];
}



void myCircularQueueFree(MyCircularQueue* obj) {
    assert(obj);
    free(obj->a);
    free(obj);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值