C++循环队列的实现

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值