设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 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;

}