设计循环队列(OJ题)(数组实现)

简介: 设计循环队列(OJ题)(数组实现)

typedef struct {
    int* a;//定义数组
    int front;//头元素下标
    int tail;//尾元素下标
    int k;//数组容量
} MyCircularQueue;
bool myCircularQueueIsEmpty(MyCircularQueue* obj); 
bool myCircularQueueIsFull(MyCircularQueue* obj);
//初始化
MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* q = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));//为结构体申请空间
    q->a = (int*)malloc(sizeof(int) * (k + 1));//为数组a申请容量为k+1的空间
    //如果不多申请一个空间,判空和判满就不能区分开来
    q->front = q->tail = 0;//初始化操作
    q->k = k;
    return q;
}
//入队
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if (myCircularQueueIsFull(obj))
    {
        return false;
    }
    //tail是下一个元素的下标
    obj->a[obj->tail] = value;
    obj->tail++;
    obj->tail %= (obj->k + 1);//tail如果是最后一个元素的下一个下标,tail=0;
    return true;
}
//出队
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj))
    {
        return false;
    }
    obj->front++;
    obj->front %= (obj->k + 1);//front如果是最后一个元素的下一个下标,front=0
    return true;
}
//取队头元素
int myCircularQueueFront(MyCircularQueue* obj) {
    if (obj->front == obj->tail)
    {
        return -1;
    }
    return obj->a[obj->front];
}
//取队尾元素
int myCircularQueueRear(MyCircularQueue* obj) {
    if (obj->front == obj->tail)
    {
        return -1;
    }
    if (obj->tail == 0)//由于tail是队尾下一个元素的下标,所以取k-1位置元素时,要特殊处理
    {
        return obj->a[obj->k];
    }
    else
    {
        return obj->a[(obj->tail-1)];
    }
}
//判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{
    return obj->front == obj->tail;
}
//判满
bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return obj->front == (obj->tail+1)%(obj->k+1);//tail+1后再对申请的最大容量值取模,等于front就满了
}
//释放内存
void myCircularQueueFree(MyCircularQueue* obj)
{
    free(obj->a);
    free(obj);
}

这段代码是用数组实现的一个循环队列的结构和操作。循环队列是一种利用单个固定大小的缓冲区来存储数据的数据结构,它的特点是队尾和队首相连,形成一个环状的结构1。循环队列可以解决普通队列在插入和删除元素后会产生不可用的空间的问题2

这段代码定义了一个名为MyCircularQueue的结构体,它包含以下四个成员变量:

  • int* a:一个指向数组的指针,用来存储队列中的元素。
  • int front:一个整数,表示队首元素的下标。
  • int tail:一个整数,表示队尾元素的下一个位置的下标。
  • int k:一个整数,表示数组的容量。

这段代码还定义了以下几个函数:

  • bool myCircularQueueIsEmpty(MyCircularQueue* obj):判断队列是否为空,如果front和tail相等,则返回true,否则返回false。
  • bool myCircularQueueIsFull(MyCircularQueue* obj):判断队列是否为满,如果front等于tail加一再对k+1取模,则返回true,否则返回false。
  • MyCircularQueue* myCircularQueueCreate(int k):创建一个容量为k+1的数组,并初始化front和tail为0,返回一个指向结构体的指针。
  • bool myCircularQueueEnQueue(MyCircularQueue* obj, int value):向队列中插入一个元素value,如果队列已满,则返回false,否则将value赋值给a[tail],并将tail加一再对k+1取模,返回true。
  • bool myCircularQueueDeQueue(MyCircularQueue* obj):从队列中删除一个元素,如果队列为空,则返回false,否则将front加一再对k+1取模,返回true。
  • int myCircularQueueFront(MyCircularQueue* obj):获取队首元素的值,如果队列为空,则返回-1,否则返回a[front]。
  • int myCircularQueueRear(MyCircularQueue* obj):获取队尾元素的值,如果队列为空,则返回-1,否则根据tail是否为0来返回a[tail-1]或a[k]。
  • void myCircularQueueFree(MyCircularQueue* obj):释放数组和结构体占用的内存空间。
相关文章
数据结构:链表的一些经典的OJ题目,环形链表问题
数据结构:链表的一些经典的OJ题目,环形链表问题
|
4月前
|
存储 索引
【数据结构OJ题】设计循环队列
力扣题目——设计循环队列
32 1
【数据结构OJ题】设计循环队列
|
5月前
|
存储 算法
数据结构和算法学习记录——设计循环队列(数组实现循环队列)核心思路、题解过程、完整题解
数据结构和算法学习记录——设计循环队列(数组实现循环队列)核心思路、题解过程、完整题解
44 1
|
6月前
leetcode-1441:用栈操作构建数组
leetcode-1441:用栈操作构建数组
38 0
|
6月前
|
存储 算法
【PTA刷题】求链式线性表的倒数第K项(代码+详解)
【PTA刷题】求链式线性表的倒数第K项(代码+详解)
197 0
|
C语言
【每日易题】数据结构链表篇——单链表oj题(1),几道典型例题带你快速掌握单链表
【每日易题】数据结构链表篇——单链表oj题(1),几道典型例题带你快速掌握单链表
79 0
|
C语言 C++
单链表OJ题:LeetCode--面试题:02.04 分割链表
LeetCode--面试题02.04:分割链表与牛客网--CM11.分割链表联合解题过程,附带完整代码与图解。
453 0
【基础算法】单链表的OJ练习(6) # 复制带随机指针的链表 #
【基础算法】单链表的OJ练习(6) # 复制带随机指针的链表 #
|
存储 C语言 C++
栈和队列OJ题思路分享之栈和队列互换(C语言实现)
我们紧接上一章的刷题分享来把后面两个题给搞定,它们分别是: 1. 用队列实现栈: 力扣225题— 2. 用栈实现队列: 力扣232题. 如果你还没有自己实现过栈和队列,或者没有栈和队列的现成结构,请跳转栈和队列详解,或者去我的码云自取. 这里的题目需要使用自己实现过的结构!