循环队列的实现,首先需要一个空的缓冲器,假设有k个空间,若
只给k个空间,那么何时是满,何时是空呢?
所以此时就需要一个空间来缓冲
这便是基本的设计思路,删除就是front往后移,插入就是rear往后移,但每次都要判空和取余,防止越界的发生。
typedef struct {
int* a;
int front;
int rear;
int k;
} MyCircularQueue;
bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* p =(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
p->a =(int*)malloc(sizeof(int)*(k+1));
p->front=0;
p->rear=0;
p->k = k;
return p;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if(myCircularQueueIsFull(obj))
return false;
obj->a[obj->rear++] = value;
obj->rear = (obj->rear)%(obj->k+1);
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj))
return false;
else
{
obj->front++;
obj->front%=(obj->k+1);
return true;
}
}
int myCircularQueueFront(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj))
return -1;
return obj->a[obj->front];
}
int myCircularQueueRear(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj))
return -1;
else
{
int tail = obj->rear-1;
if(tail == -1)
tail = obj->k;
return obj->a[tail];
}
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
if(obj->front == obj->rear)
return true;
else
return false;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
if(obj->front == (obj->rear+1)%(obj->k+1))
return true;
else
return false;
}
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->a);
free(obj);
}
一般来说对于取队尾的数字,需要判断,因为都是用rear-1去访问的,若rear在第一个空间中,则减一会发生越界访问。
还有很多具体的细节,做一次题,体会下就会理解的更深。