循环队列的实现
queue.h:
/**********************************************************************
* @file
* @brief 循环队列
*
* @version 2.0
* @date 2015-07-18
* @author
*
* Copyright(C) 2015
* All rights reserved.
*
***********************************************************************/
/* 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>
<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>
<div class="se-preview-section-delimiter"></div>
<div class="se-preview-section-delimiter"></div>
/*------------------------------------------------------
* 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;
}