链接:力扣
//1.用数组模拟实现循环队列,用int head;和int tail记录头和尾的位置,使得头删不用挪动数组,只需要挪动int head;
//2.或者用链表实现,头删也不用挪动数组
typedef struct {
int* a;//动态数组
int k;//元素个数
int head;//
int tail;
} MyCircularQueue;
//初始化循环队列
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
assert(obj);
obj->a=(int *)malloc(sizeof(int)*(k+1));//法1.因为tail==head只能判空,不能判满,所以要多开一个空间使tail->next=head;判满。法2.其实也可以根据tail==head和k的数值判满。这里用的是法1。
assert(obj->a);
obj->head=obj->tail=0;
obj->k=k;//数组k+1长,有k个元素
return obj;
}
//判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
assert(obj);
return obj->head==obj->tail;
}
//判满
bool myCircularQueueIsFull(MyCircularQueue* obj) {
assert(obj);
int next=obj->tail +1;
//!!!注意next==k+1时候也要使其变为0;
//法1. next%=(k+1);
//法2.
if(next==obj->k +1)
{
next=0;
}
return next==obj->head;
}
//从队尾入队
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) //入队
{
assert(obj);
//判满--满了则返回false
if( myCircularQueueIsFull(obj))
return false;
//一开始有元素和无元素是一样的,head指向首元素,tail指向尾元素的下一个
obj->a[obj->tail]=value;
obj->tail++;
//法1. obj->tail%=(k+1);--因为数组k+1长,放k个元素
//法2.
if(obj->tail==obj->k+1)
{
obj->tail=0;
}
return true;
}
//从队头出队列
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
assert(obj);
if(myCircularQueueIsEmpty(obj))
return false;
obj->head++;
//法1. head%=(k+1);
//法2.
if(obj->head==obj->k+1)
{
obj->head=0;
}
return true;
}
//取队头元素
int myCircularQueueFront(MyCircularQueue* obj) {
assert(obj);
if(myCircularQueueIsEmpty(obj))
return -1;
return obj->a[obj->head];
}
//取队尾元素
int myCircularQueueRear(MyCircularQueue* obj) {
assert(obj);
if(myCircularQueueIsEmpty(obj))
return -1;
//这里不能用取模手段了,因为tail-1==-1;
//把tail-1再怎么模,-1%(k+1)得(-1);
int prev=obj->tail-1;
if(prev==-1)
{
prev=obj->k;
//或,prev+=obj->k +1
}
return obj->a[prev];
}
//释放
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->a);
free(obj);
}
/**
* Your MyCircularQueue struct will be instantiated and called as such:
* MyCircularQueue* obj = myCircularQueueCreate(k);
* bool param_1 = myCircularQueueEnQueue(obj, value);
* bool param_2 = myCircularQueueDeQueue(obj);
* int param_3 = myCircularQueueFront(obj);
* int param_4 = myCircularQueueRear(obj);
* bool param_5 = myCircularQueueIsEmpty(obj);
* bool param_6 = myCircularQueueIsFull(obj);
* myCircularQueueFree(obj);
*/