Leetcode之C语言实现循环队列

文章目录

  • 前言
  • 一、什么是循环队列
  • 二、循环队列的实现
  • 总结

前言

这是一道Leetcode中一道中等难度的队列题,题名622. 设计循环队列
题目要求:
Leetcode之C语言实现循环队列_第1张图片

一、什么是循环队列

循环队列(CircularQueue)就是首位相接的队列,有基于数组实现,也有基于链表实现,一般特指基于数组实现的循环队列。在数组的循环队列中,其出队的时间复杂的明显要优于普通的数组队列。其本质上则是通过两个指针,队首指针与队尾指针来实现。这种结构的优势就是开辟有限的空间,却能够反复使用开辟的空间,提高了内存利用率。

二、循环队列的实现

循环队列可以使用链表来实现,但一般采用数组来实现循环队列,下面我也将会采用数组来实现循环队列。
先举个例子,假设这个队列最大存储数据的个数为X,那么我们应该创建一个容量为**(X+1)大小的队列。这样做的好处是为了方便我们对队列判空判满更加方便。
如图:
Leetcode之C语言实现循环队列_第2张图片从图中不难看出,其判断一个循环队列是否为满的
条件就是**(tail+1)%(X+1)==head.
让我们再看看判空的条件又是那些,如图:
Leetcode之C语言实现循环队列_第3张图片队列判空条件就是: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));//申请空间K+1   
    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语言实现循环队列的具体方法,希望对大家有所帮助,感谢大家的观看!

你可能感兴趣的:(结构体,c语言,c++,开发语言)