队列拥有先进先出特性,类似生活中的排队场景,多应用于缓冲区的设计等。
循环队列就是当front或者rear即将产生数组越界时,将其置为0。
本文用数组实现循环队列,感兴趣的朋友也可以用链表实现循环队列。
以下为源码。
queue.h
#ifndef __QUEUE_H__
#define __QUEUE_H__
#include "stm32f10x.h"
#include <string.h>
#define MaxQueueLength 20
#define LoopQueue
typedef struct
{
uint32_t Array[MaxQueueLength];
uint32_t front;
uint32_t rear;
uint32_t length;
}QueueNode;
typedef unsigned int QueueState;
QueueState Queue_Init(QueueNode * pHead);
QueueState Queue_IsEmpytOrFull(QueueNode * pHead);
QueueState Queue_AddValue(QueueNode * pHead,const uint32_t value);
QueueState Queue_OutPut(QueueNode * pHead, uint32_t *pBuffer , uint32_t nBytes);
#endif
queue.c
#include "queue.h"
/**
* @name Queue_Init.
* @brief Init My Queue.
* @param ListNode * pHead: Head of the queue.
* @retval 0 : Succeed.
1 : Head of queue is NULL
* @author Jiao Wo Yi Sheng Xiao Ming Ge.
* @Date 2018.5.30
**/
QueueState Queue_Init(QueueNode * pHead)
{
if(pHead == NULL)
return 1;
pHead->front = 0;
pHead->rear = 0;
pHead->length = 0;
memset(pHead->Array,0x00,sizeof(pHead->Array));
return 0;
}
/**
* @name Queue_IsEmpytOrFull.
* @brief Get the queue state.
* @param ListNode * pHead: Head of the queue.
* @retval 0 : Not full or empty.
1 : The queue is empyt.
2 : The queue is full.
3 : Head of queue is NULL
* @author Jiao Wo Yi Sheng Xiao Ming Ge.
* @Date 2018.5.30
**/
QueueState Queue_IsEmpytOrFull(QueueNode * pHead)
{
uint32_t length = pHead->length;
if(pHead == NULL)
return 3;
if(length == sizeof(pHead->Array)/(sizeof(uint32_t)))
return 2;
if(length == 0)
{assert_param("what the fuck");
return 1;}
return 0;
}
/**
* @name Queue_AddValue.
* @brief Add value to the queue.
* @param ListNode * pHead: Head of the queue.
const uint32_t value: Value added to the queue
* @retval 0 : Succeed.
1 : The queue is full.
2 : Head of queue is NULL.
* @author Jiao Wo Yi Sheng Xiao Ming Ge.
* @Date 2018.5.30
**/
QueueState Queue_AddValue(QueueNode * pHead, const uint32_t value)
{
if(pHead == NULL)
return 2;
if(Queue_IsEmpytOrFull(pHead) == 2)
return 1;
if(pHead->rear > MaxQueueLength - 1)
pHead->rear = 0;
pHead->Array[pHead->rear++] = value;
pHead->length ++;
return 0;
}
static QueueState Queue_OutValue(QueueNode * pHead, uint32_t *pBuffer)
{
if(pHead == NULL)
return 2;
if(Queue_IsEmpytOrFull(pHead) == 1)
return 1;
*pBuffer = pHead->Array[pHead->front];
pHead->Array[pHead->front++] = 0;
if(pHead->front > MaxQueueLength - 1)
pHead->front = 0;
pHead->length --;
return 0;
}
/**
* @name Queue_OutPut.
* @brief Output values in queue to buffer.
* @param ListNode * pHead : Head of the queue.
uint32_t * pBuffer: Value added to the queue.If it's NULL,then clear the queue.
const uint32_t nBytes:Output bytes numbers.
* @retval 0 : Succeed.
1 : Head of queue is NULL.
2 : Length of output bytes is beyond queue.
* @author Jiao Wo Yi Sheng Xiao Ming Ge.
* @Date 2018.5.30
**/
QueueState Queue_OutPut(QueueNode * pHead, uint32_t *pBuffer , uint32_t nBytes)
{
uint32_t i = 0;
if(pHead == NULL)
return 1;
if(nBytes > pHead->length)
nBytes = pHead->length;//If use "return 2;" ,do nothing.
if(pBuffer != NULL)
{
for(i =0;i<nBytes;i++)
Queue_OutValue(pHead,pBuffer++);
}else
Queue_Init(pHead);
return 0;
}