欢迎使用CSDN-markdown编辑器

来源:互联网 发布:安卓js css本地打包 编辑:程序博客网 时间:2024/06/15 00:36

循环队列的实现

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;}
0 0