当前位置: 首页 > news >正文

C语言数据结构———循环消息队列,数组方式实现

C语言数据结构———循环消息队列,数组方式实现

  • 参考内容
  • 消息队列数据类型结构体
  • 一、初始化消息队列
  • 二、消息队列是否为空
  • 三、消息队列是否已满
  • 四、消息入队
  • 五、消息出队
  • 六、其他函数
  • 七、函数汇总

参考内容

  • C语言数据结构———循环队列(静态数组实现方式)
  • C语言数据结构———循环队列(动态数组实现方式)
  • C语言数据结构———链式队列(链表实现方式)
  • C语言数据结构———循环队列(数组实形式用宏定义方式实现)
  • C语言数据结构——循环队列,数组方式实现



消息队列数据类型结构体


typedef struct
{
    u16 Type; /* 消息类型 */
    u16 Data; /* 消息值 */
}xSuper_Message_TypeDef;

typedef struct
{       
    u8 Front, Rear;                   //队首 队尾
    u8 Size;                          //大小
    xSuper_Message_TypeDef * pMsgDat; //数据指针
}xSuper_MesgQueue_TypeDef;




一、初始化消息队列

在这里插入图片描述


/* 初始化消息队列 */
void vMesgQueue_Init(xSuper_MesgQueue_TypeDef * pQueue, xSuper_Message_TypeDef * pMesg, u8 size)
{
    pQueue->Front   = pQueue->Rear = 0;
    pQueue->Size    = size;
    pQueue->pMsgDat = pMesg;
}



二、消息队列是否为空

在这里插入图片描述


/* 消息队列是否为空 */
u8 xMesgQueue_IsEmpty(xSuper_MesgQueue_TypeDef * pQueue)
{
    /* 队首与队尾相等队列为空 */
    if (pQueue->Front == pQueue->Rear) return 1;
    else                               return 0;
}



三、消息队列是否已满

在这里插入图片描述


/* 消息队列是否已满 */
u8 xMesgQueue_IsFull(xSuper_MesgQueue_TypeDef * pQueue)
{
    /* 队尾下一个元素为队首队列已满 */
    if (((pQueue->Rear + 1) % pQueue->Size) == pQueue->Front) return 1;
    else                                                      return 0;
}



四、消息入队

在这里插入图片描述


/* 消息入队 */
static void vSuper_MesgQueue_Enter(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData)
{
    pQueue->pMsgDat[pQueue->Rear].Type = msgType;
    pQueue->pMsgDat[pQueue->Rear].Data = msgData;
    pQueue->Rear = (pQueue->Rear + 1) % pQueue->Size;
}


/* 消息入队 */
u8 xMesgQueue_Enter(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData)
{
    /* 队列已满 */
    if (xMesgQueue_IsFull(pQueue)) return 1;

   /* 消息入队 */
    vSuper_MesgQueue_Enter(pQueue, msgType, msgData);

    return 0;
}




/* 获取队尾前索引 */
static u16 xSuper_MesgQueue_RearBeforIndex(xSuper_MesgQueue_TypeDef * pQueue)
{
    return ((pQueue->Rear - 1 + pQueue->Size) % pQueue->Size);
}


/* 强制消息入队 */
void vMesgQueue_Enter_Force(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData)
{
    u8 i = 0;

    /* 队列已满 */
    if (xMesgQueue_IsFull(pQueue)) 
    {
        i = xSuper_MesgQueue_RearBeforIndex(pQueue);
        pQueue->pMsgDat[i].Type = msgType;
        pQueue->pMsgDat[i].Data = msgData;
    }
    else                           
    {
        vSuper_MesgQueue_Enter(pQueue, msgType, msgData);
    }
}



五、消息出队

在这里插入图片描述


/* 消息出队 */
static xSuper_Message_TypeDef * xSuper_MesgQueue_Output(xSuper_MesgQueue_TypeDef * pQueue)
{
    xSuper_Message_TypeDef * pMsg = NULL;

    pMsg = &pQueue->pMsgDat[pQueue->Front];
    pQueue->Front = (pQueue->Front + 1) % pQueue->Size;

    return pMsg;
}


/* 消息出队 */
xSuper_Message_TypeDef * xMesgQueue_Output(xSuper_MesgQueue_TypeDef * pQueue)
{
    /* 队列为空 */
    if (xMesgQueue_IsEmpty(pQueue)) return NULL;

    /* 消息出队 */
    return xSuper_MesgQueue_Output(pQueue);
}



六、其他函数


/* 获取消息队列元素个数 */
u16 xMesgQueue_GetCount(xSuper_MesgQueue_TypeDef * pQueue)
{
    return ((pQueue->Rear - pQueue->Front + pQueue->Size) % pQueue->Size);
}


/* 清除消息队列 */
void vMesgQueue_Clear(xSuper_MesgQueue_TypeDef * pQueue)
{
    pQueue->Front = pQueue->Rear = 0;
}



七、函数汇总


void vMesgQueue_Init(xSuper_MesgQueue_TypeDef * pQueue, xSuper_Message_TypeDef * pMesg, u8 size);
void vMesgQueue_Enter_Force(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData);
void vMesgQueue_Clear(xSuper_MesgQueue_TypeDef * pQueue);


u8 xMesgQueue_Enter(xSuper_MesgQueue_TypeDef * pQueue, u16 msgType, u16 msgData);
u8 xMesgQueue_IsEmpty(xSuper_MesgQueue_TypeDef * pQueue);
u8 xMesgQueue_IsFull(xSuper_MesgQueue_TypeDef * pQueue);


xSuper_Message_TypeDef * xMesgQueue_Output(xSuper_MesgQueue_TypeDef * pQueue);
u16 xMesgQueue_GetCount(xSuper_MesgQueue_TypeDef * pQueue);



相关文章:

  • 零基础学QT、C++(六)制作桌面摄像头软件
  • 利用miniqmt实现远程下单:量化交易的新突破
  • Python爬虫-批量爬取股票数据猫各股票代码
  • Open WebUI 是什么
  • centos9安装k8s集群
  • C#从入门到精通(34)—如何防止winform程序被同时打开多次
  • 嵌入式之宏定义编程机制
  • vue中将el-table导出为excel文件
  • Django Admin: 动态合并数据库和预定义选项的高级过滤器实现
  • 【废物研究生刷算法】字符串
  • 嵌入式标志位解决程序卡顿问题
  • 工具--安川伺服故障代码
  • Open WebUI选择模型为空,解决办法(for DeepSeek)
  • Vue3 + Spring WebMVC 验证码案例中的跨域问题与解决方法
  • v4l2子系统学习(三)编写虚拟摄像头驱动
  • 清华大学第五弹:《DeepSeek与AI幻觉》
  • 编译部署使用腾讯云cpp-cos-sdk
  • Python爬虫实战:获取六图网漫画图
  • TYPE-C接口充电速度提升对电池寿命的影响
  • Drools 议程组(AgendaGroup)执行顺序实验
  • “五一”假期国内出游3.14亿人次,国内游客出游总花费1802.69亿元
  • “模”范生上海,如何再进阶?
  • 体坛联播|米兰逆转热那亚豪取3连胜,阿诺德官宣离开利物浦
  • 巴菲特批评贸易保护主义:贸易不该被当成武器来使用
  • 澳大利亚大选今日投票:聚焦生活成本与“特朗普问题”
  • 因雷雨、沙尘等天气,这些机场航班运行可能受影响