队列 C语言实现

嵌入式软件中,受硬件内存所限,最好别采用动态分配和回收,对于某些数据结构,最好提前分配好内存,便于管理。

自己实现一个队列的数据结构,用作备份。

 

/* 队列结构,队列大小XXX_QUEUE_SIZE和事件结构XXX_T根据需要自己定义 */
typedef struct
{
    u16     usFront;    /* 队首 */
    u16     usRear;     /* 队尾 */
    u16     usMaxNum;   /* 队列最大容量 */
    void    *pvData;
} QUEUE_T;

/* 队列初始化 */
void queue_init(QUEUE_T *pstQueue, XXX_T *pstXXXArray)
{
    pstQueue->usFront = 0;
    pstQueue->usRear = 0;
    pstQueue->usMaxNum = XXX_QUEUE_SIZE;
    memset(&pstXXXArray[0], 0, sizeof(XXX_T) * XXX_QUEUE_SIZE);
    pstQueue->pvData = pstEventArray;
}

/* 实际能存储的元素有效个数为(SEND_EVENT_QUEUE_SIZE - 1) */
s32 is_queue_full(QUEUE_T *pstQueue)
{
    if (pstQueue->usFront == ((pstQueue->usRear + 1) % pstQueue->usMaxNum))
    {
        return 0;
    }
    return -1;
}

s32 is_queue_empty(QUEUE_T *pstQueue)
{
    if (pstQueue->usFront == pstQueue->usRear)
    {
        return 0;
    }
    return -1;
}

/* push一个事件到队列 */
void push_queue_info(QUEUE_T *pstQueue, XXX_T *pstInfo)
{
    XXX_T *pstData = (XXX_T*)pstQueue->pvData;
    /* 如果队列满,删除最老的记录 */
    if (0 == is_queue_full(pstQueue))
    {
        pstQueue->usFront = (pstQueue->usFront + 1) % pstQueue->usMaxNum;
    }

    memcpy(pstData + pstQueue->usRear, pstInfo, sizeof(XXX_T));
    pstQueue->usRear = (pstQueue->usRear + 1) % pstQueue->usMaxNum;
}

/* 从队列中pop一个事件 */
s32 pop_queue_info(QUEUE_T *pstQueue)
{
    XXX_T  *pstData = (XXX_T*)pstQueue->pvData;
    if (0 == is_queue_empty(pstQueue))
    {
        return -1;
    }

    memset(pstData + pstQueue->usFront, 0, sizeof(XXX_T));
    pstQueue->usFront = (pstQueue->usFront + 1) % pstQueue->usMaxNum;

    return 0;
}

/* 获取队列中的第一个事件 */
s32 get_front_queue_info(QUEUE_T *pstQueue, XXX_T *pstInfo)
{
    XXX_T  *pstData = (XXX_T*)pstQueue->pvData;
    if (0 == is_queue_empty(pstQueue))
    {
        return -1;
    }

    memcpy(pstInfo, pstData + pstQueue->usFront, sizeof(XXX_T));
    return 0;
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值