具体任务:
基于循环队列,初始化一个队列,该队列可容纳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");
}