Task10 循环队列的API设计与应用

具体任务:

基于循环队列,初始化一个队列,该队列可容纳20个元素,且元素的类型为short型,先入队10个元素(依次为1~10),再入队5个元素(1、5、10、20、25),然后出队12个元素,并将出队的这12个元素依次通过printf函数打印出来,同时,计算队列中元素的个数。

代码:

DataType.h部分

/*********************************************************************************************************
* 模块名称: DataType.h
* 摘    要: 定义数据类型
* 当前版本: 1.0.0
* 作    者: 努摆的皮卡皮
* 完成日期: 2022年07月26日  
* 内    容:
* 注    意:                                                                   
**********************************************************************************************************
* 取代版本: 
* 作    者:
* 完成日期: 
* 修改内容: 
* 修改文件: 
*********************************************************************************************************/
#ifndef _DATA_TYPE_H_
#define _DATA_TYPE_H_

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/

/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/
typedef signed char         i8;
typedef signed short        i16;
typedef signed int          i32;
typedef unsigned char       u8;
typedef unsigned short      u16;
typedef unsigned int        u32;

#define TRUE          1
#define FALSE         0

/*********************************************************************************************************
*                                              枚举结构体定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              API函数声明
*********************************************************************************************************/

#endif

  Queue.h部分

/*********************************************************************************************************
* 模块名称: Queue.h
* 摘    要: 队列
* 当前版本: 1.0.0
* 作    者:努摆的皮卡皮
* 完成日期: 2022年07月26日 
* 内    容:
* 注    意:                                                                   
**********************************************************************************************************
* 取代版本: 
* 作    者:
* 完成日期: 
* 修改内容:
* 修改文件: 
*********************************************************************************************************/
#ifndef _QUEUE_H_
#define _QUEUE_H_

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/
#include "DataType.h"

/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              枚举结构体定义
*********************************************************************************************************/
//定义队列中元素的数据类型
typedef u8  DATA_TYPE;

//定义循环队列结构体
typedef struct
{
  i16       front;          //头指针,队非空时指向队头元素
  i16       rear;           //尾指针,队非空时指向队尾元素的下一个位置
  i16       bufLen;         //队列的总容量
  i16       elemNum;        //当前队列中的元素的数量
  DATA_TYPE *pBuffer;       //队列的元素存储区地址
}StructCirQue;

/*********************************************************************************************************
*                                              API函数声明
*********************************************************************************************************/
void  InitQueue(StructCirQue* pQue, DATA_TYPE* pBuf, i16 len);  //初始化队列
void  ClearQueue(StructCirQue* pQue);                           //清队列
u8    QueueEmpty(StructCirQue* pQue);                           //判断队列是否为空,1-空,0-非空
i16   QueueLength(StructCirQue* pQue);                          //返回队列中元素个数,即为队列的长度
i16   EnQueue(StructCirQue* pQue, DATA_TYPE* pInput, i16 len);  //入队len个元素
i16   DeQueue(StructCirQue* pQue, DATA_TYPE* pOutput, i16 len); //出队len个元素

#endif

 Queue.c部分

/*********************************************************************************************************
* 模块名称: Queue.c
* 摘    要: 队列
* 当前版本: 1.0.0
* 作    者: 努摆的皮卡皮
* 完成日期: 2022年07月26日  
* 内    容:
* 注    意:                                                                   
**********************************************************************************************************
* 取代版本: 
* 作    者:
* 完成日期: 
* 修改内容:
* 修改文件: 
*********************************************************************************************************/

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/
#include "Queue.h"

/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              枚举结构体定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部变量
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部函数声明
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部函数实现
*********************************************************************************************************/

/*********************************************************************************************************
*                                              API函数实现
*********************************************************************************************************/

/*********************************************************************************************************
* 函数名称: InitQueue
* 函数功能: 初始化队列 
* 输入参数: pQue-结构体指针,即指向队列结构体的地址,pBuf-队列的元素存储区地址,len-队列的容量
* 输出参数: pQue-结构体指针,即指向队列结构体的地址
* 返 回 值: void
* 创建日期: 2022年07月26日
* 注    意: 
*********************************************************************************************************/
void  InitQueue(StructCirQue* pQue, DATA_TYPE* pBuf, i16 len)
{
  i16 i;

  pQue->front         = 0;      //队头
  pQue->rear          = 0;      //队尾
  pQue->bufLen        = len;    //buffer长度(容量)
  pQue->elemNum       = 0;      //当前队列中元素的个数
  pQue->pBuffer       = pBuf;   //指针变量pBuf赋给指针变量que->pBuffer
  
  for(i = 0; i < len; i++)
  {
    pQue->pBuffer[i]  = 0;      //对指针变量pQue->pBuffer所指向的元素赋初值0
  }
}

/*********************************************************************************************************
* 函数名称: ClearQueue
* 函数功能: 清队列,相当于把火车车厢里的人清走
* 输入参数: pQue-结构体指针,即指向队列结构体的地址
* 输出参数: pQue-结构体指针,即指向队列结构体的地址
* 返 回 值: void
* 创建日期: 2022年07月26日
* 注    意: 
*********************************************************************************************************/
void  ClearQueue(StructCirQue* pQue)
{
  pQue->front         = 0;      //队头
  pQue->rear          = 0;      //队尾
  pQue->elemNum       = 0;      //当前的数据长度
}

/*********************************************************************************************************
* 函数名称: QueueEmpty
* 函数功能: 判断队列是否为空,1-空,0-非空 
* 输入参数: pQue-结构体指针,即指向队列结构体的地址
* 输出参数: pQue-结构体指针,即指向队列结构体的地址
* 返 回 值: 返回队列是否为空,1-空,0-非空
* 创建日期: 2022年07月26日
* 注    意: 
*********************************************************************************************************/
u8    QueueEmpty(StructCirQue* pQue)
{
  return(0 == pQue->elemNum);
}

/*********************************************************************************************************
* 函数名称: QueueLength
* 函数功能: 返回队列中元素个数,即为队列的长度 ,相当于算一下一共有多少车厢
* 输入参数: pQue-结构体指针,即指向队列结构体的地址
* 输出参数: pQue-结构体指针,即指向队列结构体的地址
* 返 回 值: 队列中元素的个数
* 创建日期: 2022年07月26日
* 注    意: 
*********************************************************************************************************/
i16   QueueLength(StructCirQue* pQue)
{
  return(pQue->elemNum);
}

/*********************************************************************************************************
* 函数名称: EnQueue
* 函数功能: 插入len个元素(存放在起始地址为pInput的存储区中)到为队列 
* 输入参数: pQue-结构体指针,即指向队列结构体的地址,pInput-待入队数组的地址,len-期望入队元素的数量
* 输出参数: pQue-结构体指针,即指向队列结构体的地址
* 返 回 值: 成功入队的元素的数量
* 创建日期: 2022年07月26日
* 注    意: 每次插入一个元素,rear自增,当rear的值大于等于数据buffer的长度bufLen时,rear值变为零。需要注意
*           的是,当数据buffer中的元素数量加上新写入的元素数量超过buffer的长度时,buffer能接收的元素数量为
*           buffer的容量-buffer中已有的元素数量,即EnQueue函数对于超出的元素采取不理睬的态度。
*********************************************************************************************************/
i16 EnQueue(StructCirQue* pQue, DATA_TYPE* pInput, i16 len)//(队列保存的内存地址,入队元素,入队长度)
{
  i16 wLen = 0;                 //待入队的元素有len个,wLen从0增加到len-1,用于与下面的wLen++配合循环while
  
  while((pQue->elemNum < pQue->bufLen) && (wLen < len))//(需要进入的队列长度<队列所剩容量&用于停止进入队列函数)
  {
    pQue->pBuffer[pQue->rear] = pInput[wLen]; //将待入队的第wLen个元素pInput[wLen]插入队列中
    pQue->rear++;               //队尾rear自增,即指向队尾元素的下一个位置
    
    if(pQue->rear >= pQue->bufLen)
    {
      pQue->rear = 0;           //如果队尾元素的下一个位置为pQue->bufLen,则rear指向队头,循环体现在此处
    }

    wLen++;
    pQue->elemNum++;            //当前队列中的元素总数
  }

  return wLen;                  //如果返回值wLen为0,表示没有元素入队
}

/*********************************************************************************************************
* 函数名称: DeQueue
* 函数功能: 从队列中取出len个元素,放入起始地址为pOutput的存储区 
* 输入参数: pQue-结构体指针,即指向队列结构体的地址,len-预期出队元素的数量
* 输出参数: pQue-结构体指针,即指向队列结构体的地址,pOutput-出队元素存放的数组的地址
* 返 回 值: 成功出队的元素的数量
* 创建日期: 2022年07月26日
* 注    意: 每次取出一个元素,front自增,当front的值大于等于数据buffer的长度bufLen时,front值变为零。需要
*           特别注意的是,从队列中提取元素的前提是队列中需要至少有一个元素,当期望取出的元素数量len小于或
*           等于队列中元素的数量时,可以按期望取出len个元素,否则,只能取出队列中已有的所有元素。 
*********************************************************************************************************/
i16 DeQueue(StructCirQue* pQue, DATA_TYPE* pOutput, i16 len)
{
  i16 rLen = 0;                 //期望取出len个元素,最终能取出rLen个元素
  
  while((pQue->elemNum > 0) && (rLen < len))
  {
    pOutput[rLen] = pQue->pBuffer[pQue->front];
    pQue->front++;
    
    if( pQue->front >= pQue->bufLen )
    {
      pQue->front = 0;          //如果队头元素的下一个位置为pQue->bufLen,则front指向队头,循环体现在此处
    }

    rLen++;
    pQue->elemNum--;            //当前队列中的元素总数
  }

  return rLen;                  //如果返回值rLen为0,表示队列中没有元素
}

 App.c部分

/*********************************************************************************************************
* 模块名称: App.c
* 摘    要: 测试队列
* 当前版本: 1.0.0
* 作    者: 努摆的皮卡皮
* 完成日期: 2022年07月26日
* 内    容:
* 注    意:
**********************************************************************************************************
* 取代版本:
* 作    者:
* 完成日期:
* 修改内容:
* 修改文件:
*********************************************************************************************************/

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/
#include <stdio.h>
#include <stdlib.h> 
#include "Queue.h"

/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              枚举结构体定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部变量
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部函数声明
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部函数实现
*********************************************************************************************************/

/*********************************************************************************************************
*                                              API函数实现
*********************************************************************************************************/

/*********************************************************************************************************
* 函数名称: main
* 函数功能: 主函数
* 输入参数: void
* 输出参数: void
* 返 回 值: void
* 创建日期: 2022年07月26日
* 注    意: 该函数的主要目的是测试循环队列是否正确
*********************************************************************************************************/
void main(void)
{
    StructCirQue    cirQueForTest;        //定义循环队列中
    DATA_TYPE i;                          //DATA_TYPE数据类型
    DATA_TYPE bufForTest[20];             //循环队列中的buffer,可容纳20个元素

    i16       len;                        //长度

    DATA_TYPE arrBufForOutput[20];        //从队列取出的数据放入此数组
    DATA_TYPE annd[5];                    //给后入队的5个数放到此处
    DATA_TYPE arrBufForInput[10];          //先入队的10个数据放到此处
    DATA_TYPE dataForTest;                //便于printf调用

    for (i = 0; i < 10; i++)
    {
        arrBufForInput[i] = i + 1;//给先入队的10个数起上名字
    }

    for (i = 0; i < 20; i++)
    {
        arrBufForOutput[i] = 0;//对从队列取出的数据所放入的数组进行初始化
    }

    annd[0] = 1;//给后入队的5个数起上名字
    annd[1] = 5;
    annd[2] = 10;
    annd[3] = 20;
    annd[4] = 25;

    InitQueue(&cirQueForTest, bufForTest, 20);//初始化队列


    //入队10个数据(从1到10)
    printf("**************TEST1-入队10个数据******************\n");

    len = EnQueue(&cirQueForTest, arrBufForInput, 10);

    printf("队列数量: %d\n", len);

    for (i = 0; i < 10; i++)
    {
        dataForTest = cirQueForTest.pBuffer[i];
        printf("addr=%d, dataInput=%d\n", i, dataForTest);
    }
    //入队5个数据
    printf("**************TEST2-入队5个数据******************\n");

    len = EnQueue(&cirQueForTest, &annd[0], 5);

    printf("队列数量: %d\n", len);

    for (i = 0; i < 15; i++)
    {
        dataForTest = cirQueForTest.pBuffer[i];
        printf("addr=%d, dataInput=%d\n", i, dataForTest);
    }

    //出队12个数据
    printf("**************TEST3-出队12个数据******************\n");

    len = DeQueue(&cirQueForTest, arrBufForOutput, 12);

    printf("队列数量: %d\n", len);

    for (i = 0; i < 12; i++)
    {
        printf("i=%d, dataOuput=%d\n", i, arrBufForOutput[i]);
    }

    system("pause");
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值