Leetcode之C语言实现循环队列

前言

这是一道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));//申请空间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语言实现循环队列的具体方法,希望对大家有所帮助,感谢大家的观看!

  • 28
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1无名之辈1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值