原题链接:
这次使用的是链表设计的循环队列,等下会再写一个用数组实现的
循环队列里有一个头指针,用来控制队头出队,一个尾指针,用来控制队尾入队,还有个尾前指针,用来控制队尾的前一个数据,和顺序表实现的循环队列一样,我们多出来一个节点用来控制队满。尾指针->next == 头指针就相当于队满了,空出来的这个节点不存储数据。
代码如下:
typedef struct Node{
int data;
struct Node* next;
}Node;
typedef struct {
Node* head;
Node* tail;
Node* tail_pre;
} MyCircularQueue;
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->tail == obj->head;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
if(obj->tail->next == obj->head)
{
return true;
}
else
{
return false;
}
}
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* obj = (MyCircularQueue*)calloc(sizeof(MyCircularQueue),1);
int tmp = k+1;
obj->head = NULL;
obj->tail = NULL;
Node* cur = NULL;
while(tmp--)
{
Node* newNode = (Node*)calloc(sizeof(Node),1);
if(obj->head == NULL && obj->tail == NULL)
{
obj->head = obj->tail = obj->tail_pre=newNode;
cur = obj->head;
}
else
{
cur->next = newNode;
cur = newNode;
}
}
cur->next = obj->head;
return obj;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if(myCircularQueueIsFull(obj))
{
return false;
}
else
{
obj->tail->data = value;
obj->tail_pre = obj->tail;
obj->tail = obj->tail->next;
return true;
}
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj))
{
return false;
}
else
{
obj->head = obj->head->next;
return true;
}
}
int myCircularQueueFront(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj))
{
return -1;
}
return obj->head->data;
}
int myCircularQueueRear(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj))
{
return -1;
}
return obj->tail_pre->data;
}
void myCircularQueueFree(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj))
{
obj->head = obj->tail = obj->tail_pre = NULL;
return;
}
Node* cur = obj->head->next;
free(obj->head);
obj->tail->next = NULL;
while(cur)
{
Node* next = cur->next;
free(cur);
cur = next;
}
free(obj);
}