前言
这是一道Leetcode中一道中等难度的队列题,题名622. 设计循环队列 题目要求:
一、什么是循环队列
循环队列(CircularQueue)就是首位相接的队列,有基于数组实现,也有基于链表实现,一般特指基于数组实现的循环队列。在数组的循环队列中,其出队的时间复杂的明显要优于普通的数组队列。其本质上则是通过两个指针,队首指针与队尾指针来实现。这种结构的优势就是开辟有限的空间,却能够反复使用开辟的空间,提高了内存利用率。
二、循环队列的实现
循环队列可以使用链表来实现,但一般采用数组来实现循环队列,下面我也将会采用数组来实现循环队列。 先举个例子,假设这个队列最大存储数据的个数为X,那么我们应该创建一个容量为**(X+1)大小的队列。这样做的好处是为了方便我们对队列判空和判满更加方便。 如图: 从图中不难看出,其判断一个循环队列是否为满的条件就是**(tail+1)%(X+1)==head. 让我们再看看判空的条件又是那些,如图: 队列判空条件就是:head等于tail的时候。 现在我们就直接上具体实现的代码:
typedef struct {
int* a;
int k;
int head;
int tail;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k)
{
MyCircularQueue* newnode = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
newnode->k = k;
newnode->head = 0;
newnode->tail = 0;
newnode->a = (int*)malloc(sizeof(int)*(1+k));
return newnode;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
{
if(!myCircularQueueIsFull(obj))
{
obj->a[obj->tail] = value;
obj->tail = (obj->tail+1)%(obj->k+1);
return true;
}
return false;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj)
{
if(myCircularQueueIsEmpty(obj))
{
return false;
}
obj->head = (obj->head +1)%(obj->k+1);
return true;
}
int myCircularQueueFront(MyCircularQueue* obj)
{
if(myCircularQueueIsEmpty(obj))
{
return -1;
}
return obj->a[obj->head];
}
int myCircularQueueRear(MyCircularQueue* obj)
{
if(myCircularQueueIsEmpty(obj))
{
return -1;
}
if(obj->tail==0)
{
return obj->a[obj->k];
}
return obj->a[obj->tail-1];
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{
if(obj->tail == obj->head)
return true;
return false;
}
bool myCircularQueueIsFull(MyCircularQueue* obj)
{
if((obj->tail+1)%(obj->k+1)==obj->head)
{
return true;
}
else if(obj->tail==obj->k &&obj->head==0)
{
return true;
}
else
{
return false;
}
}
void myCircularQueueFree(MyCircularQueue* obj)
{
free(obj->a);
free(obj);
}
总结
以上就是用C语言实现循环队列的具体方法,希望对大家有所帮助,感谢大家的观看!
|