首页 > 其他分享 >CircularQueue

CircularQueue

时间:2024-04-26 21:36:50浏览次数:19  
标签:下标 CircularQueue 队列 Manager 循环 return CircQueue

CircularQueue

/***********************************************************
 *
 *    file name:     CircularQueue  interface
 *    author   :     [email protected]
 *    date     :     2024/04/23
 *    function :     Make great CV engineer
 *    note     :
 *
 *    CopyRight (c)  2023-2024  [email protected]  All Right Resever
 *
 * ***********************************************************/

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

/********************************************************************************
 *
 *Function name:CircularQueue.c
 *Function function:CircularQueue interface
 *Function parameter:
 *Return the result:
 **atters needing attention:[email protected]
 *Function author:
 *Creation date:2024/04/26
 *Modify history:
 *Function version:v1.0
 *
 *******************************************************************************/

// 指的是循环队列中的元素的数据类型,用户可以根据需要进行修改
typedef int DataType_t;

// 构造记录循环队列Circu1 arQueue各项参数(循环队列的首地址+循环队列的容量+循环队列队尾下标+队首下标)的结构体
typedef struct CircularQueue
{
    DataType_t *Addr; // 记录循环队列首地址

    unsigned int Size; // 记录循环队列的容量

    int Rear; // 循环队列队尾下标

    int Front; // 循环队列队首下标
} CircQueue_t;

// 创建循环队列并对循环队列进行初始化
CircQueue_t *CircQueue_Create(unsigned int size)
{
    // 1.利用ca11oc为循环队列的管理结构体申请一块堆内存
    CircQueue_t *Manager = (CircQueue_t *)calloc(1, sizeof(CircQueue_t));

    if (NULL == Manager)
    {
        perror("calloc memory for manager is failed!");
        exit(-1); // 程序异常终止
    }

    // 2.利用ca11oc为所有元素申请堆内存
    Manager->Addr = (DataType_t *)calloc(size, sizeof(DataType_t));

    if (NULL == Manager->Addr)
    {
        perror("calloc memory for element is failed");
        free(Manager);
        exit(-1); // 程序异常终止
    }

    // 3.对管理循环队列的结构体进行初始化(循环队列容量+队尾下标+队首下标)
    Manager->Size = size; // 对循环队列中的容量进行初始化
    Manager->Rear = 0;    // 队尾下标初值为0
    Manager->Front = 0;   // 队首下标初值为0

    return Manager;
}

 //判断循环队列是否已满
 bool CircQueue_IsFull(CircQueue_t *Manager)
{
    return ((Manager->Rear +1)%Manager->Size == Manager->Front )? true : false;
 }

// 判断循环队列是否为空
bool CircQueue_IsEmpty(CircQueue_t *Manager)
{
    return (Manager->Front = Manager->Rear) ? true : false;
}

// 入队
bool CircQueue_Enqueue(CircQueue_t *Manager, DataType_t Data)
{
    // 1.判断循环队列是否已满
    if (CircQueue_IsFull(Manager))
    {
        printf("CircQueue is Full!\n");
        return false;
    }

    // 2.如果循环队列有空闲空间,则把新元素添加到循环队列尾部
    Manager->Addr[Manager->Rear] = Data;
    // 防止队尾下标越界
    Manager->Rear = (Manager->Rear + 1) % Manager->Size;

    return true;
}


// 出队
DataType_t CircQueue_Dequeue(CircQueue_t *Manager)
{
    DataType_t temp = 0;
    // 1.判断循环队列是否为空
    if (CircQueue_IsEmpty(Manager))
    {
        printf("cirQueue is Empty!\n");
        return false;
    }
    // 2.把元素从队首出队,并备份到变量temp
    temp = Manager->Addr[Manager->Front];
    // 防止队首下标越界
    Manager->Front = (Manager->Front + 1) % Manager->Size;
    return temp;
}


int main(int argc, char const *argv[])
{
    
    CircQueue_t *Manager = CircQueue_Create(10);
    CircQueue_Enqueue(Manager, 4);
    CircQueue_Enqueue(Manager, 5);
    
    return 0;
}

标签:下标,CircularQueue,队列,Manager,循环,return,CircQueue
From: https://www.cnblogs.com/xiaoyaoj/p/18160901

相关文章