需求:
实现存储数据时,保证数据容器里一直是最新数据且顺序排列,读取数据时,不影响容器里的数据。
解决方案:
采用队列数据结构,队列具有“先进先出”的规则。
源码如下:
#define MAXSIZE 6 //比实际存储数据多一个
/*************************************************************************//**
* @struct SeqQueue
* @brief
* @details
*****************************************************************************/
typedef struct
{
uint8_t data[MAXSIZE];
uint8_t front; /*头指针*/ ///<只用来标定数组头 不用于dequeue
uint8_t rear; /*尾指针*/ ///<标定数组尾部 用于enqueue
}SeqQueue;
/*************************************************************************//**
* @brief
* enQueue
* @author Jen_Hsueh 2020/4/26
****************************************************************************/
uint8_t enQueue(SeqQueue *pQueue, uint8_t data)
{
//判断队列是否满
if ((pQueue->rear + 1) % MAXSIZE == pQueue->front)
{
//出列一个元素再重新入列
//front指针向后移一位置,若到最后则转到数组头部
pQueue->front = (pQueue->front + 1) % MAXSIZE;
}
//将元素赋值给队尾
pQueue->data[pQueue->rear] = data;
//rear指针向后移一位置,若到最后则转到数组头部
pQueue->rear = (pQueue->rear + 1) % MAXSIZE;
return TRUE;
}
/*************************************************************************//**
* @brief
* deQueue
* dequeue 当前整个队列
* @author Jen_Hsueh 2020/4/26
****************************************************************************/
uint8_t deQueue(SeqQueue *pQueue, uint8_t *pBuffer)
{
uint8_t i = 0;
//暂时用一个变量标记队头
uint8_t queueFrontTemp = pQueue->front;
//如果队列不为空
while(queueFrontTemp != pQueue->rear)
{
//将队头元素赋给变量
*(pBuffer + i) = pQueue->data[queueFrontTemp];
//指针向后移一位置,若到最后则转到数组头部
queueFrontTemp = (queueFrontTemp + 1) % MAXSIZE;
i++;
}
return TRUE;
}
/*************************************************************************//**
* @brief
* deQueue
* dequeue 当前整个队列
* @author Jen_Hsueh 2020/4/26
****************************************************************************/
uint8_t deQueueById(SeqQueue *pQueue, uint8_t id, uint8_t *data;)
{
//暂时用一个变量标记队头
uint8_t queueFrontTemp = pQueue->front;
uint8_t tempId = 0;
//如果队列不为空
while(queueFrontTemp != pQueue->rear)
{
if(id == tempId)
{
*pBuffer = pQueue->data[queueFrontTemp];
return TRUE;
}
//指针向后移一位置,若到最后则转到数组头部
queueFrontTemp = (queueFrontTemp + 1) % MAXSIZE;
tempId ++;
if(tempId > MAXSIZE-1)
{
break;
}
}
return FALSE;
}
static SeqQueue s_dataQueue = {0};
int main(void)
{
//入列
enQueue(&s_dataQueue, 1);
}
如果enqueue和dequeue操作处于两个线程,需要注意添加互斥锁。