循环队列: 队尾指针到达数组末尾时, 如果数组头部有空位置,
队尾指针可以回到头部, 继续存储.
队首指针指向第一个元素, 队尾指针指向最后一个元素位置加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;
}
4395

被折叠的 条评论
为什么被折叠?



