欢迎使用CSDN-markdown编辑器

循环队列的实现

queue.h:


/**********************************************************************
* @file     
* @brief    循环队列
*           
* @version  2.0
* @date     2015-07-18
* @author   
*
* Copyright(C) 2015 
* All rights reserved.
*
***********************************************************************/
#ifndef _QUEUE_H_
#define _QUEUE_H_
/* Includes -----------------------------------------------------------------------*/
```#include <stdbool.h>```
/* Exported types ---------------------------------------------------------------*/
typedef struct
{
     unsigned char *fifo;      //队列缓冲区
     unsigned short size;     //队列缓冲区的长度(可用长度为size - 1 因为rear要占用一个空间)
     unsigned short front;    //头指针,若队列非空,指向队列头元素
     unsigned short rear;     //尾指针,若队列非空,指向队列尾元素的下一个位置

}Queue_t;
/* Exported functions -------------------------------------------------------- */
bool InitQueue(Queue_t *Q,unsigned char *DataBuf,unsigned int BufLen);
bool QueuePut(Queue_t *Q, unsigned char e);
bool QueueGet(Queue_t *Q,unsigned char *Data);
void QueueClr(Queue_t *Q);




<div class="se-preview-section-delimiter"></div>

#endif




<div class="se-preview-section-delimiter"></div>

queue.c:

/**********************************************************************
* @file     
* @brief    循环队列实现
*           
* @version  2.0
* @date     2015-07-18
* @author   
*
* Copyright(C) 2015 
* All rights reserved.
*
***********************************************************************/




<div class="se-preview-section-delimiter"></div>

#include "queue.h"




<div class="se-preview-section-delimiter"></div>

#include <stddef.h>




<div class="se-preview-section-delimiter"></div>

#include <stdbool.h>


/*------------------------------------------------------
* Function name :InitQueue
* Description   :构造一个队列
* param         :Q   -  队列控制块
*                buf -  队列缓冲区
*                len -  缓冲区长度
* reval         :true :初始化成功
-------------------------------------------------------*/
bool InitQueue(Queue_t *Q,unsigned char *buf,unsigned short len)
{
    if(DataBuf == NULL || BufLen == 0)return false;
    Q->fifo = DataBuf;
    Q->size = BufLen;
    Q->front = 0;
    Q->rear = 0;
    return true;
}


/*-----------------------------------------------------
* Function name : IsEmpty
* Description   : 判断队列是否为空
* param         : none
* reval         : true 空标志
------------------------------------------------------*/
bool IsQEmpty(Queue_t *Q)
{
    return (Q->front == Q->rear);
}


/*-----------------------------------------------------
* Function name : IsEmpty
* Description   : 判断队列是否为满
* param         : none
* reval         : true 满标志
-----------------------------------------------------*/
bool IsQFull(Queue_t *Q)
{
    return ( (Q->rear + 1) % Q->size == Q->front);
}


/*-----------------------------------------------------
* Function name : EnQueue
* Description   : 在队列中插入一个元素
* param         : Q.队列控制块 e.待插入的元素
* reval         : 操作成功:返回Q_OK 
------------------------------------------------------*/
bool QueuePut(Queue_t *Q, unsigned char e)
{
    if ( IsQFull(Q) )
    {
        return false;
    }
    else
    {
        Q->fifo[Q->rear] = e;/*数据进队-----------------*/
        Q->rear = (Q->rear+1)%Q->size;/*偏移队尾针,并形成循环结构*/
    }
    return true;
}




/*-----------------------------------------------------
* Function name :QueueGet
* Description   :从队列中移出一个元素
* param         :Q    - 队列控制块
* ouput         :Data
* reval         :操作成功:返回true
------------------------------------------------------*/
bool QueueGet(Queue_t *Q,unsigned char *e)
{
    if( IsQEmpty(Q) )//队列是空的
    {
        return false;
    }
    else
    {
        *e = Q->fifo[Q->front];/*数据出队----------*/
        Q->front = (Q->front+1) % Q->size;/*偏移队首针,并形成循环结构*/
    }
    return true;
}


/*------------------------------------------------------
* Function name : QueueClr
* Description   : 清空队列
* param         : Q   -  待清空的队列
* reval         : None
------------------------------------------------------*/
void QueueClr(Queue_t *Q)
{
    Q->front = Q->rear = 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值