C语言数据结构——循环队列,数组方式实现

参考内容




队列数据类型结构体


typedef struct
{       
    u16 Front, Rear;  //队首 队尾
    u16 Size;         //大小
    u8 * pData;       //数据指针
}xSuper_RingQueue_TypeDef;




一、队列初始化

在这里插入图片描述


/* 初始化队列 */
void vRingQueue_Init(xSuper_RingQueue_TypeDef * pQueue, u8 * pData, u16 size)
{
    pQueue->Front = pQueue->Rear = 0;
    pQueue->Size  = size;
    pQueue->pData = pData;
}



二、判断队列是否为空

在这里插入图片描述


/* 队列是否为空 */
u8 xRingQueue_IsEmpty(xSuper_RingQueue_TypeDef * pQueue)
{
    /* 队首与队尾相等队列为空 */
    if (pQueue->Front == pQueue->Rear) return 1;
    else                               return 0;
}



三、判断队列是否已满

在这里插入图片描述


/* 队列是否已满 */
u8 xRingQueue_IsFull(xSuper_RingQueue_TypeDef * pQueue)
{
    /* 队尾下一个元素为队首队列已满 */
    if (((pQueue->Rear + 1) % pQueue->Size) == pQueue->Front) return 1;
    else                                                      return 0;
}



四、数据入队过程

在这里插入图片描述


/* 获取队列元素个数 */
u16 xRingQueue_GetCount(xSuper_RingQueue_TypeDef * pQueue)
{
    return ((pQueue->Rear - pQueue->Front + pQueue->Size) % pQueue->Size);
}


/* 数据入队 */
static void vSuper_RingQueue_EnterByte(xSuper_RingQueue_TypeDef * pQueue, u8 data)
{
    pQueue->pData[pQueue->Rear] = data;
    pQueue->Rear = (pQueue->Rear + 1) % pQueue->Size;
}


/* 数据入队(字节) */
u8 xRingQueue_EnterByte(xSuper_RingQueue_TypeDef * pQueue, u8 data)
{
    /* 队列已满 */
    if (xRingQueue_IsFull(pQueue)) return 1;

    /* 数据入队 */
    vSuper_RingQueue_EnterByte(pQueue, data);

    return 0;
}



/* 获取队尾前索引 */
static u16 xSuper_RingQueue_RearBeforIndex(xSuper_RingQueue_TypeDef * pQueue)
{
    return ((pQueue->Rear - 1 + pQueue->Size) % pQueue->Size);
}

/* 强制数据入队(字节) */
void vRingQueue_EnterByte_Force(xSuper_RingQueue_TypeDef * pQueue, u8 data)
{
    u16 i = 0;


    /* 队列已满 */
    if (xRingQueue_IsFull(pQueue)) 
    {
        i = xSuper_RingQueue_RearBeforIndex(pQueue);
        pQueue->pData[i] = data;
    }
    else                           
    {
        vSuper_RingQueue_EnterByte(pQueue, data);
    }
}


/* 数据入队 */
u16 xRingQueue_EnterData(xSuper_RingQueue_TypeDef * pQueue, u8 * pData, u16 len)
{
    u16 i = 0, num = 0, count = 0;

    /* 实际存储数量 */
    count = pQueue->Size - xRingQueue_GetCount(pQueue) - 1;
    num   = (len > count) ? count : len;

    /* 数据入队 */
    for (i = 0; i < num; i++) 
    {
        vSuper_RingQueue_EnterByte(pQueue, pData[i]);
    }

    /* 实际存储数量 */
    return num;
}



五、数据出队过程

在这里插入图片描述

/* 出队 */
static u8 xSuper_RingQueue_OutputByte(xSuper_RingQueue_TypeDef * pQueue)
{
    u8 dat = 0;

    /* 数据出队 */
    dat = pQueue->pData[pQueue->Front];
    pQueue->Front = (pQueue->Front + 1) % pQueue->Size;

    return dat;
}


/* 数据出队(字节) */
u8 xRingQueue_OutputByte(xSuper_RingQueue_TypeDef * pQueue)
{
    /* 队列已空 */
    if (xRingQueue_IsEmpty(pQueue)) return 0;

    /* 数据出队 */
    return xSuper_RingQueue_OutputByte(pQueue);
}


/* 数据出队 */
u16 xRingQueue_OutputData(xSuper_RingQueue_TypeDef * pQueue, u8 * pData, u16 len)
{
    u16 i = 0, num = 0, count = 0;

    /* 实际存储数量 */
    count = xRingQueue_GetCount(pQueue);
    num   = (len > count) ? count : len;

    /* 数据出队 */
    for (i = 0; i < num; i++) 
    {
        pData[i] = xSuper_RingQueue_OutputByte(pQueue);
    }

    /* 实际存储数量 */
    return num;
}



六、其他函数


/* 清空队列 */
void vRingQueue_Clear(xSuper_RingQueue_TypeDef * pQueue)
{
    pQueue->Front = pQueue->Rear = 0;
}


/* 显示队列信息 */
void vRingQueue_ShowInfo(xSuper_RingQueue_TypeDef * pQueue)
{
    u16 i = 0, num = 0, front = 0;
    u8 dat = 0;
    
    num   = xRingQueue_GetCount(pQueue);
    front = pQueue->Front;

    printf("-------------------------------------------------------------\r\n");
    printf("Front:%-3u Rear:%-3u  Size:%-3u Count:%u\r\n", pQueue->Front, pQueue->Rear, pQueue->Size, num);
    printf("-------------------------Ring Queue Info---------------------\r\n");
    dprintf("            00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  \r\n");
    printf("--------------------------------------------------------------\r\n");
    for (i = 0; i < num; i++) 
    {
        if (i && ((i % 16) == 0)) printf("\r\n");
        if ((i % 16) == 0)        printf("0x%08X  ", i);

        dat = pQueue->pData[front];
        front = (front + 1) % pQueue->Size;
        printf("%02X ", dat);
    }
    printf("\r\n");
    printf("--------------------------------------------------------------\r\n");
    printf("\r\n\r\n\r\n");
}



七、函数汇总


void vRingQueue_Init(xSuper_RingQueue_TypeDef * pQueue, u8 * pData, u16 size);
void vRingQueue_EnterByte_Force(xSuper_RingQueue_TypeDef * pQueue, u8 data);
void vRingQueue_ShowInfo(xSuper_RingQueue_TypeDef * pQueue);
void vRingQueue_Clear(xSuper_RingQueue_TypeDef * pQueue);


u8 xRingQueue_EnterByte(xSuper_RingQueue_TypeDef * pQueue, u8 data);
u8 xRingQueue_OutputByte(xSuper_RingQueue_TypeDef * pQueue);
u8 xRingQueue_IsEmpty(xSuper_RingQueue_TypeDef * pQueue);
u8 xRingQueue_IsFull(xSuper_RingQueue_TypeDef * pQueue);


u16 xRingQueue_OutputData(xSuper_RingQueue_TypeDef * pQueue, u8 * pData, u16 len);
u16 xRingQueue_EnterData(xSuper_RingQueue_TypeDef * pQueue, u8 * pData, u16 len);
u16 xRingQueue_GetCount(xSuper_RingQueue_TypeDef * pQueue);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值