当前位置:   article > 正文

Leetcode之C语言实现循环队列_在无序整数集合中查找 分数 25 作者 伍建全 单位 重庆科技学院 给定一个无序的整

在无序整数集合中查找 分数 25 作者 伍建全 单位 重庆科技学院 给定一个无序的整

前言

这是一道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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86

总结

以上就是用C语言实现循环队列的具体方法,希望对大家有所帮助,感谢大家的观看!

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号