一、简介
循环队列程序,可作为程序库使用。包含:队列创建(动态和静态)、入队、出队和删除队列函数。可用于51和ARM单片机。
二、头文件定义
在2.1和2.2的程序,主要是声明和定义,放在头文件里即可。
2.1、自定义关键词
typedef unsigned char CircleQueue_U8; //8位无符号整形
typedef unsigned short int CircleQueue_U16; //16位无符号整形
typedef unsigned long int CircleQueue_U32; //32位无符号整形
typedef enum
{
CircleQueue_NULL, //空执行
CircleQueue_OK, //执行成功
CircleQueue_ERROR, //执行出错
}
CircleQueue_Result; //函数执行结果
typedef struct
{
CircleQueue_U16 head; //队头
CircleQueue_U16 tail; //队尾
CircleQueue_U16 size; //队列长度
CircleQueue_U8 *p_buffer; //队列缓存
}
CircleQueue_typedef; //队列
2.2、接口函数声明
供其他程序文件调用的函数,函数主体见“3、工程文件”。
/*
* 功能:动态创建一个队列
* 输入:@size队列长度
* 输出:队列句柄
* 备注:
*/
CircleQueue_typedef* CircleQueueDynamicCreat(CircleQueue_U16 size);
/*
* 功能:静态创建一个队列
* 输入:@p_queue:队列空间名称
* @size:队列长度
* 输出:队列句柄
* 备注:
*/
CircleQueue_typedef* CircleQueueStaticCreat(CircleQueue_U8* p_queue,CircleQueue_U16 size);
/*
* 功能:入队
* 输入:@p_queue:队列句柄
* @data:入队数据
* 输出:CircleQueue_ERROR:队列句柄为空,或队列空间为0,因此入队失败
* CircleQueue_OK:入队成功
* 备注:
*/
CircleQueue_Result CircleQueueEnterData(CircleQueue_typedef* p_queue,CircleQueue_U8 data);
/*
* 功能:出队
* 输入:@p_queue:队列句柄
* @p_data:出队缓存
* 输出:CircleQueue_NULL:队列无数据,出队失败
* CircleQueue_ERROR:队列句柄为空,或队列空间为0,出队失败
* CircleQueue_OK:出队成功
* 备注:
*/
CircleQueue_Result CircleQueueOutData(CircleQueue_typedef* p_queue,CircleQueue_U8* p_data);
/*
* 功能:清除队列内容
* 输入:@p_queue:队列句柄
* 输出:CircleQueue_OK:清除成功
* CircleQueue_ERROR:队列句柄为空
* 备注:
*/
CircleQueue_Result CircleQueueClearData(CircleQueue_typedef* p_queue);
/*
* 功能:获取队列数据长度
* 输入:@p_queue:队列句柄
* 输出:数据长度
* 备注:
*/
CircleQueue_U16 CircleQueueGetSize(CircleQueue_typedef* p_queue);
/*
* 功能:删除队列
* 输入:@p_queue:队列句柄
* 输出:CircleQueue_OK:删除成功
* 备注:
*/
CircleQueue_Result CircleQueueDelete(CircleQueue_typedef* p_queue);
三、工程文件
从3.1至3.5为函数主体,放在工程文件中。
用到的malloc和free,需包含头文件stdlib.h。
3.1、动态创建队列
/*
* 功能:动态创建一个队列
* 输入:@size队列长度
* 输出:队列句柄
* 备注:
*/
CircleQueue_typedef* CircleQueueDynamicCreat(CircleQueue_U16 size)
{
CircleQueue_typedef* circle_queue_handle = NULL;
circle_queue_handle = (CircleQueue_typedef*)malloc(sizeof(CircleQueue_typedef));
circle_queue_handle->p_buffer = (CircleQueue_U8*)malloc(sizeof(CircleQueue_U8)*(size + 1));
circle_queue_handle->size = size;
circle_queue_handle->head = 0;
circle_queue_handle->tail = 0;
return circle_queue_handle;
}
3.2、静态创建队列
/*
* 功能:静态创建一个队列
* 输入:@p_buffer:队列空间名称
* @size:队列长度
* 输出:队列句柄
* 备注:
*/
CircleQueue_typedef* CircleQueueStaticCreat(CircleQueue_U8* p_buffer,CircleQueue_U16 size)
{
CircleQueue_typedef* circle_queue_handle = NULL;
circle_queue_handle = (CircleQueue_typedef*)malloc(sizeof(CircleQueue_typedef));
circle_queue_handle->p_buffer = p_buffer;
circle_queue_handle->size = size;
circle_queue_handle->head = 0;
circle_queue_handle->tail = 0;
return circle_queue_handle;
}
3.3、数据入队
/*
* 功能:入队
* 输入:@queue:队列句柄
* @data:入队数据
* 输出:CircleQueue_ERROR:队列句柄为空,或队列空间为0,因此入队失败
* CircleQueue_OK:入队成功
* 备注:
*/
CircleQueue_Result CircleQueueEnterData(CircleQueue_typedef* p_queue,CircleQueue_U8 data)
{
if(p_queue == NULL) //判断:队列句柄为空
{
return CircleQueue_ERROR;
}
else
{
if(p_queue->size == 0) //判定:队列空间为0
{
return CircleQueue_ERROR;
}
else //判定:队列空间不为0
{
p_queue->p_buffer[p_queue->tail] = data; //操作:入队
p_queue->tail ++; //累计:队尾
p_queue->tail = p_queue->tail % p_queue->size; //计算:队尾循环
return CircleQueue_OK;
}
}
}
3.4、数据出队
/*
* 功能:出队
* 输入:@p_queue:队列句柄
* @p_data:出队缓存
* 输出:CircleQueue_NULL:队列无数据,出队失败
* CircleQueue_ERROR:队列句柄为空,或队列空间为0,出队失败
* CircleQueue_OK:出队成功
* 备注:
*/
CircleQueue_Result CircleQueueOutData(CircleQueue_typedef* p_queue,CircleQueue_U8* p_data)
{
if(p_queue == NULL) //判断:队列句柄为空
{
return CircleQueue_ERROR;
}
else
{
if(p_queue->size == 0) //判定:队列空间为0
{
return CircleQueue_ERROR;
}
else //判定:队列空间不为0
{
if(p_queue->head == p_queue->tail) //判定:队列无数据
{
return CircleQueue_NULL;
}
else
{
*p_data = p_queue->p_buffer[p_queue->head]; //操作:出队
p_queue->head ++; //累计:对头
p_queue->head = p_queue->head % p_queue->size; //计算:对头循环
return CircleQueue_OK;
}
}
}
}
3.5、清除队列内容
/*
* 功能:清除队列内容
* 输入:@p_queue:队列句柄
* 输出:CircleQueue_OK:清除成功
* CircleQueue_ERROR:队列句柄为空
* 备注:
*/
CircleQueue_Result CircleQueueClearData(CircleQueue_typedef* p_queue)
{
if(p_queue == NULL) //判断:队列句柄为空
{
return CircleQueue_ERROR;
}
else
{
p_queue->head = 0;
p_queue->tail = 0;
return CircleQueue_OK;
}
}
3.6、获取队列数据长度
/*
* 功能:获取队列数据长度
* 输入:@p_queue:队列句柄
* 输出:数据长度
* 备注:
*/
CircleQueue_U16 CircleQueueGetSize(CircleQueue_typedef* p_queue)
{
if(p_queue == NULL) //判断:队列句柄为空
{
return 0;
}
else
{
if(p_queue->tail < p_queue->head)
{
return (p_queue->size - p_queue->head + p_queue->tail);
}
else
{
return (p_queue->tail - p_queue->head);
}
}
}
3.7、删除队列
/*
* 功能:删除队列
* 输入:@p_queue:队列句柄
* 输出:CircleQueue_OK:删除成功
* 备注:
*/
CircleQueue_Result CircleQueueDelete(CircleQueue_typedef* p_queue)
{
free(p_queue->p_buffer);
p_queue->p_buffer = NULL;
free(p_queue);
p_queue = NULL;
return CircleQueue_OK;
}
四、示例程序
4.1、动态创建队列
动态创建一个队列的步骤:
(1)定义队列句柄、队列长度。
CircleQueue_typedef* ExampleQueue_Handle; //队列句柄
#define ExampleQueue_Size //队列长度
(2)创建队列。
ExampleQueue_Handle = CircleQueueDynamicCreat(ExampleQueue_Size);
4.2、静态创建队列
(1)定义队列句柄、队列长度。
CircleQueue_typedef* ExampleQueue_Handle; //队列句柄
#define ExampleQueue_Size //队列长度
(2)定义队列缓存。
CircleQueue_U8 ExampleQueue_Buffer[ExampleQueue_Size]; //队列缓存
(3)创建队列。
ExampleQueue_Handle = CircleQueueStaticCreat(ExampleQueue_Buffer,ExampleQueue_Size);
4.3、入队、出队和删除队列
入队示例程序:
CircleQueueEnterData(ExampleQueue_Handle,example_value); //example_value为要入队的值
出队示例程序:
CircleQueueOutData(ExampleQueue_Handle,&example_buffer); //example_buffer出队数据缓存
删除队列:
CircleQueueDelete(ExampleQueue_Handle);