Circular queue的实现
1.先定义一个结构体
typedef struct CirQueue
{
unsigned char *pBuffer; //队列的缓冲区
unsigned int front;//队列的头序号
unsigned int rear;//队列的尾序号
unsigned int numbers;//队列中元素的个数
unsigned int isFull; //队列溢出标志 0 没有溢出 1队列溢出
unsigned int depth; //队列的个数
unsigned int itemSize;//队列元素的大小
}CirQueue;
2.几个重要的宏
//判断队列为空
#define QUEUE_IS_EMPTY(_pxQueue) ((((CirQueue*)(_pxQueue))->numbers == 0)?1:0)
//判断队列为满
#define QUEUE_IS_FULL(_pxQueue) ((((CirQueue*)(_pxQueue))->numbers >= ((CirQueue*)(_pxQueue))->depth)?1:0)
//队列中元素总个数
#define QUEUE_GET_NUMBER(_pxQueue) (((CirQueue*)(_pxQueue))->numbers)
3.几个重要的函数
//创建队列
CirQueue* QueueCreate(unsigned short depth,unsigned short itemSize);
//入队函数
unsigned char QueueInput(CirQueue* pQueue,const void *const pItem);
//出队函数
unsigned char QueueOutput(CirQueue* pQueue,void * const pItem);
//销毁队列
void QueueDestory(CirQueue* &pQueue);
4.具体实现
//创建队列
CirQueue* QueueCreate(unsigned short depth,unsigned short itemSize)
{
CirQueue* pQueue = new CirQueue;
if(pQueue != NULL)
{
pQueue->pBuffer = new unsigned char [depth * itemSize];
memset(pQueue->pBuffer,0,sizeof(unsigned char)*(depth*itemSize));
if(pQueue->pBuffer == nullptr)
{
delete pQueue;
pQueue = nullptr;
return nullptr;
}
pQueue->front = 0;
pQueue->rear = 0;
pQueue->numbers = 0;
pQueue->isFull = 0;
pQueue->depth = depth;
pQueue->itemSize = itemSize;
}
return pQueue;
}
//销毁队列
void QueueDestory(CirQueue* &pQueue)
{
if(nullptr != pQueue)
{
if(pQueue->pBuffer)
{
delete []pQueue->pBuffer;
pQueue->pBuffer = nullptr;
}
delete pQueue;
pQueue = nullptr;
}
}
//入队函数
//pItem 需要入队的指针
unsigned char QueueInput(CirQueue* pQueue,const void * const pItem)
{
unsigned char isFull = 0;
unsigned char *ptr =(unsigned char *)pQueue->pBuffer;
if(QUEUE_IS_FULL(pQueue))
{
isFull = 1;
pQueue->isFull = 1;
}
memcpy(ptr + (pQueue->rear * pQueue->itemSize),pItem,pQueue->itemSize);
pQueue->rear = (++pQueue->rear < pQueue->depth)?pQueue->rear:0;
if((pQueue->rear > pQueue->front || pQueue->rear == 0) && pQueue->numbers == pQueue->depth)
{
pQueue->front = (++pQueue->front < pQueue->depth)?pQueue->front:0;
}
pQueue->numbers = (++pQueue->numbers > pQueue->depth)?pQueue->depth:pQueue->numbers;
return isFull;
}
//出队函数
//pItem 需要出队的指针
unsigned char QueueOutput(CirQueue* pQueue,void * const pItem)
{
unsigned char *ptr = (unsigned char *)pQueue->pBuffer;
if(QUEUE_IS_EMPTY(pQueue))
{
return 1;
}
memcpy(pItem,ptr+(pQueue->front * pQueue->itemSize),pQueue->itemSize);
memset(ptr + (pQueue->front * pQueue->itemSize),0,sizeof(unsigned char)*(pQueue->itemSize));
pQueue->front = (++pQueue->front < pQueue->depth)?pQueue->front:0;
pQueue->numbers--;
return 0;
}