循环队列设计

循环队列: 队尾指针到达数组末尾时, 如果数组头部有空位置,
队尾指针可以回到头部, 继续存储.
队首指针指向第一个元素, 队尾指针指向最后一个元素位置加1

队尾指针指向的位置是不能存储数据的
因此数组最多存储的元素个数为数组长度减1 

 

数组长度: N
队列为空: head == tail
队列为满: head == (tail+1)%N
队列长度: L = (N+tail-head)%N

优点: 可以节省空间, 出队列时不用移动数据
 

代码实现:

/*循环队列
  采用空闲单元法,最多存(CIRCULAR_QUEUE_LEN-1)个元素
  队空条件:head == rear
  队满条件:head == (rear+1)%N
  队列长度:L = (N+rear-head)%N
*/
#define CIRCULAR_QUEUE_LEN  (10)
typedef struct
{
	Uint16 uQueue[CIRCULAR_QUEUE_LEN];
	Uint16 uHead;
	Uint16 uTail;
	Uint16 uQueueSize;
}SCircularQueue;

SCircularQueue g_SCircularQueue={{0},0,0,CIRCULAR_QUEUE_LEN};

/*队列是否为空*/
bool isQueueEmpty(SCircularQueue * pCircularQueue)
{
	return (pCircularQueue->uTail == pCircularQueue->uHead) ?
			true : false;
}

/*队列是否已满*/
bool isQueueFull(SCircularQueue * pCircularQueue)
{
	return (pCircularQueue->uHead == ((pCircularQueue->uTail + 1) % pCircularQueue->uQueueSize) ?
			true : false;
}

/*获取队列长度*/
Uint16 GetQueueLen(SCircularQueue * pCircularQueue)
{
	return (pCircularQueue->uQueueSize + pCircularQueue->uTail-pCircularQueue->uHead) % pCircularQueue->uQueueSize;
}

/*元素入队列*/
bool PushElem(SCircularQueue * pCircularQueue, Uint16 uElem)
{
	bool bResult = true;
	if (isQueueFull(pCircularQueue) == false)
	{
		pCircularQueue->uQueue[pCircularQueue->uTail] = uElem;
		pCircularQueue->uTail = (pCircularQueue->uTail + 1) % pCircularQueue->uQueueSize;
		bResult = true;
	}
	else
	{
		bResult = false;
	}
	
	return bResult;
}

/*元素出队列*/
bool PopElem(SCircularQueue * pCircularQueue, Uint16 *uElem)
{
	bool bResult = true;
	if (isQueueEmpty(pCircularQueue) == false)
	{
		*uElem = pCircularQueue->uQueue[pCircularQueue->uHead];
		pCircularQueue->uHead = (pCircularQueue->uHead+1) % pCircularQueue->uQueueSize;
		bResult = true;
	}
	else
	{
		bResult = false;
	}
	
	return bResult;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值