c语言写的循环队列

来源:互联网 发布:网络前端工程师 编辑:程序博客网 时间:2024/05/28 15:07

/////////////////////////////////////////////////////////////////////////////////////////////////////
//文件名称:LoopQueue.h
//功能说明:实现了循环队列结构
//使用说明:包含本文件前必须定义QUEUE_ELEMENT_TYPE,它表示队列中元素的类型,还可定义队列的大小QUEUE_MAX_SIZE,默认为
//            64+1,由于队列中始终要有一个空元素,所以实际最多可存64个元素。
/////////////////////////////////////////////////////////////////////////////////////////////////////
#include <memory.h>
#include <assert.h>

#ifndef BOOLEAN
#define BOOLEAN int
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif

//循环队列的大寸(最大尺寸)
#ifndef QUEUE_MAX_SIZE
#define QUEUE_MAX_SIZE 64+1
#endif

#define LOOPQUEUEASSERT assert(pLQ != 0 && pLQ->front >=0 && pLQ->rear >= 0 && QUEUE_MAX_SIZE > 1)

struct LoopQueue
{
  QUEUE_ELEMENT_TYPE data[QUEUE_MAX_SIZE];
  long                front;
  long                rear;
};

//初始化循环队列
void LoopQueue_Init(LoopQueue *pLQ)
{
    pLQ->front = 0;
      pLQ->rear  = 0;
    LOOPQUEUEASSERT;
}

//判断循环队列是否为空
BOOLEAN LoopQueue_IsEmpty(LoopQueue *pLQ)
{
     LOOPQUEUEASSERT;
     return pLQ->rear==pLQ->front; 
}

//获取循环队列中存储的元素的个数
long LoopQueue_Length(LoopQueue *pLQ)
{
    LOOPQUEUEASSERT;
    return (pLQ->rear-pLQ->front+QUEUE_MAX_SIZE)%QUEUE_MAX_SIZE;
}

//入队
void LoopQueue_In(LoopQueue *pLQ, QUEUE_ELEMENT_TYPE element)
{
    LOOPQUEUEASSERT;
       if(pLQ->front==(pLQ->rear+1)%QUEUE_MAX_SIZE)
       {
         pLQ->rear=(pLQ->rear+1)%QUEUE_MAX_SIZE;
        pLQ->data[pLQ->rear] = element;
         pLQ->front=(pLQ->front+1)%QUEUE_MAX_SIZE;
       }
       else
       {
         pLQ->rear=(pLQ->rear+1)%QUEUE_MAX_SIZE;
         pLQ->data[pLQ->rear] = element;
       }
}

//出队
BOOLEAN LoopQueue_Out(LoopQueue *pLQ, QUEUE_ELEMENT_TYPE* pElement)
{
    LOOPQUEUEASSERT;
       if(LoopQueue_IsEmpty(pLQ))
        return FALSE;

    pLQ->front=(pLQ->front+1)%QUEUE_MAX_SIZE;
    *pElement = pLQ->data[pLQ->front];
    return TRUE;
}

原创粉丝点击