设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。

1.前言

环形队列有两种编写方式,一种是队列中包含元素的个数,另外一种是不包含元素的个数;
接下来将介绍这两种队列的编写方式以及区别;
leetcood题目链接;

2.带有元素个数size的编写方式

2.1条件假设

在这里插入图片描述

2.2编写逻辑

在这里插入图片描述

2.3实现代码


typedef struct {
    //int size;
    int k;
    int size;
    int *arr;
    int front;
    int rear;

} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {//初始化
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    obj->arr=(int *)malloc(sizeof(int)*(k));
    obj->k=k;
    obj->size=0;
    obj->front=obj->rear=0;
    return obj;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {//插入
if(obj->size==obj->k)//满了
return false;

obj->arr[obj->rear]=value;
obj->rear++;
obj->size++;

if(obj->rear==obj->k)//越界
obj->rear=0;
return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {//删除
if(obj->size==0)
return false;

obj->front++;
obj->size--;

if(obj->front==obj->k)//越界
obj->front=0;
return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {//返回队首元素
if(obj->size==0)
return -1;

return obj->arr[obj->front];
}

int myCircularQueueRear(MyCircularQueue* obj) {//队尾元素返回
if(obj->size==0)
return -1;

if(obj->rear==0)
return obj->arr[obj->k-1];
return obj->arr[obj->rear-1];

}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {//空?
if(obj->size==0)
return true;
return false;

}

bool myCircularQueueIsFull(MyCircularQueue* obj) {//满?
if(obj->size==obj->k)
return true;
else
return false;
}

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

3.不带元素个数的编写方式

3.1条件假设

在这里插入图片描述
在这里插入图片描述

3.2编写逻辑

在这里插入图片描述

3.3实现代码

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

} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {//初始化
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    obj->arr=(int *)malloc(sizeof(int)*(k+1));
    obj->k=k;
    obj->front=obj->rear=0;
    return obj;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {//插入
if((obj->rear+1)%(obj->k+1)==obj->front)//满了
return false;

obj->arr[obj->rear]=value;
obj->rear++;

if(obj->rear==obj->k+1)//越界了
obj->rear=0;

return true;

}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {//删除
if(obj->rear==obj->front)//为空
return false;

obj->front++;
if(obj->front==obj->k+1)
obj->front=0;
return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {//返回队首元素
if(obj->rear==obj->front)//为空
return -1;

return obj->arr[obj->front];
}

int myCircularQueueRear(MyCircularQueue* obj) {//队尾元素返回

if(obj->front==obj->rear)//为空
return -1;

if(obj->rear==0)
return obj->arr[obj->k];

return obj->arr[obj->rear-1];

}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {//空?
if(obj->rear==obj->front)//为空
return true;
return false;

}

bool myCircularQueueIsFull(MyCircularQueue* obj) {//满?
if((obj->rear+1)%(obj->k+1)==obj->front)
return true;
else
return false;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值