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;
}