设计循环队列(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):释放数组和结构体占用的内存空间。
相关文章
|
7月前
|
存储
622.设计循环队列(LeetCode)
622.设计循环队列(LeetCode)
622.设计循环队列(LeetCode)
|
7月前
|
存储
「LeetCode」622. 设计循环队列
「LeetCode」622. 设计循环队列
49 0
LeetCode | 622. 设计循环队列
LeetCode | 622. 设计循环队列
|
存储
Leetcode622.设计循环队列
Leetcode622.设计循环队列
29 0
|
6月前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
43 2
|
6月前
|
存储 算法
数据结构和算法学习记录——设计循环队列(数组实现循环队列)核心思路、题解过程、完整题解
数据结构和算法学习记录——设计循环队列(数组实现循环队列)核心思路、题解过程、完整题解
50 1
|
7月前
|
存储
LeetCode——622设计循环队列
LeetCode——622设计循环队列
|
6月前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)一
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)一
38 0
|
索引
LeetCode:设计循环队列
LeetCode:设计循环队列
46 0
|
7月前
|
存储
leetcode-622:设计循环队列
leetcode-622:设计循环队列
37 1