数据结构 - 队列的应用示例(附源码 C)

这篇博客介绍了一个利用队列数据结构来保证数据存储始终保持最新且顺序排列的解决方案。通过`enQueue`和`deQueue`函数实现数据的添加和读取,同时在多线程环境下注意加锁以防止数据竞争。代码示例展示了队列的实现和操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:
实现存储数据时,保证数据容器里一直是最新数据且顺序排列,读取数据时,不影响容器里的数据。

解决方案:
采用队列数据结构,队列具有“先进先出”的规则。

源码如下:

#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操作处于两个线程,需要注意添加互斥锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值