循环队列实用的C程序库

2 篇文章 0 订阅

一、简介

循环队列程序,可作为程序库使用。包含:队列创建(动态和静态)、入队、出队和删除队列函数。可用于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);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪恒远

感君意气无所惜,一为歌行歌主客

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值