博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FIFO队列算法的C程序实现
阅读量:5827 次
发布时间:2019-06-18

本文共 4286 字,大约阅读时间需要 14 分钟。

头文件:Queue.h

#ifndef _Queue_H#define _Queue_Htypedef struct QueueDef_        //队列对象定义{  u16       front;      //队列头部  u16       rear;       //队列尾部  u16       count;      //对列计数  u16       elemSize;   //元素大小  u16       queueCnt;   //队列大小  void *    pdat;       //指向队列数据区}QueueDef;typedef struct QueueCfgPrmtDef_ //队列初始化参数{  u16       elemSize;   //元素大小  u16       queueCnt;   //队列大小  u8*       paddr;      //指向队列数据区}QueueCfgPrmtDef;typedef enum QueueResult_       //队列操作执行结果{  _QueueFull      = 0,   _QueueEmpty     = 1,  _QueueOperateOk = 2}QueueResult;/******************************************************************************** 函数名称: QueueInit* 说    明: FIFO队列初始化* 输入参数: pdI_Queue 要初始化的队列*           pdI_Prmt  队列的初始化参数* 输出参数: 无* 返回值  : 无* 其    它: *******************************************************************************/void QueueInit(QueueDef *pdI_Queue, QueueCfgPrmtDef pdI_Prmt);/******************************************************************************** 函数名称: QueueIn* 说    明: FIFO队列插入一个元素* 输入参数: pdI_Queue  操作的队列*           pvI_Dat    插入的元素* 输出参数: 操作结果   队列满或者成功 * 返回值  : * 其    它: *******************************************************************************/QueueResult QueueIn(QueueDef *pdI_Queue, void* pvI_Dat);/******************************************************************************** 函数名称: QueueOut* 说    明: 从FIFO队列中取出一个元素* 输入参数: pdI_Queue  操作的队列    * 输出参数: 操作结果   队列空或者成功 * 返回值  : pvI_Dat    取出的元素* 其    它: *******************************************************************************/QueueResult QueueOut(QueueDef *pdI_Queue, void* pvI_Dat);

 

实现文件:Queue.c

#include "string.h"#include "Queue.h"/******************************************************************************** 函数名称: QueueInit* 说    明: FIFO队列初始化* 输入参数: pdI_Queue 要初始化的队列*           pdI_Prmt  队列的初始化参数* 输出参数: 无* 返回值  : 无* 其    它: *******************************************************************************/void QueueInit(QueueDef *pdI_Queue, QueueCfgPrmtDef* pdI_Prmt){  pdI_Queue->rear  = 0;  pdI_Queue->front = pdI_Queue->rear;  pdI_Queue->count = 0;  pdI_Queue->elemSize = pdI_Prmt->elemSize;  pdI_Queue->queueCnt = pdI_Prmt->queueCnt;  pdI_Queue->pdat     = pdI_Prmt->paddr;}/******************************************************************************** 函数名称: QueueIn* 说    明: FIFO队列插入一个元素* 输入参数: pdI_Queue  操作的队列*           pvI_Dat    插入的元素* 输出参数: 操作结果   队列满或者成功 * 返回值  : * 其    它: *******************************************************************************/QueueResult QueueIn(QueueDef *pdI_Queue, void* pvI_Dat) {  if ((pdI_Queue->front == pdI_Queue->rear) && (pdI_Queue->count == pdI_Queue->queueCnt))  {      return _QueueFull;  }  else  {       u8* operatAddr = (u8*)pdI_Queue->pdat;    operatAddr += pdI_Queue->rear * pdI_Queue->elemSize;    memcpy(operatAddr, pvI_Dat, pdI_Queue->elemSize);    pdI_Queue->rear = (pdI_Queue->rear + 1) % pdI_Queue->queueCnt;    pdI_Queue->count = pdI_Queue->count + 1;    return _QueueOperateOk;  }}/******************************************************************************** 函数名称: QueueOut* 说    明: 从FIFO队列中取出一个元素* 输入参数: pdI_Queue  操作的队列    * 输出参数: 操作结果   队列空或者成功 * 返回值  : pvI_Dat    取出的元素* 其    它: *******************************************************************************/QueueResult QueueOut(QueueDef *pdI_Queue, void* pvI_Dat){  if ((pdI_Queue->front == pdI_Queue->rear) && (pdI_Queue->count == 0))  {    return _QueueEmpty;  }  else  {    u8* operatAddr = (u8*)pdI_Queue->pdat;    operatAddr += pdI_Queue->front * pdI_Queue->elemSize;    memcpy(pvI_Dat, operatAddr, pdI_Queue->elemSize);        pdI_Queue->front = (pdI_Queue->front + 1) % pdI_Queue->queueCnt;    pdI_Queue->count = pdI_Queue->count - 1;    return _QueueOperateOk;  }}

 

测试实例:

#include "Queue.h"typedef struct ElemTypeDef_{  u8  e1;  u16 e2;  u32 e3;}ElemTypeDef;QueueDef    MyQueue;ElemTypeDef MyQueueData[10];int main(void){  ElemTypeDef sh;  QueueCfgPrmtDef prmt;  u16 i;  prmt.elemSize = sizeof(ElemTypeDef);  prmt.queueCnt = sizeof(MyQueueData) / sizeof(ElemTypeDef);  prmt.paddr    = (u8*)MyQueueData;  QueueInit(&MyQueue, &prmt);  while (1)  {    for (i = 0; i < 20; i++)    {      if (QueueIn(&MyQueue, &sh) == _QueueFull) break;    }    for (i = 0; i < 20; i++)    {      if (QueueOut(&MyQueue, &sh) == _QueueEmpty) break;    }  }}

 

参考资料:

转载地址:http://rladx.baihongyu.com/

你可能感兴趣的文章
測試文章
查看>>
Flex很难?一文就足够了
查看>>
【BATJ面试必会】JAVA面试到底需要掌握什么?【上】
查看>>
CollabNet_Subversion小结
查看>>
mysql定时备份自动上传
查看>>
Linux 高可用集群解决方案
查看>>
17岁时少年决定把海洋洗干净,现在21岁的他做到了
查看>>
linux 启动oracle
查看>>
《写给大忙人看的java se 8》笔记
查看>>
倒计时:计算时间差
查看>>
Linux/windows P2V VMWare ESXi
查看>>
Windows XP倒计时到底意味着什么?
查看>>
tomcat一步步实现反向代理、负载均衡、内存复制
查看>>
运维工程师在干什么学些什么?【致菜鸟】
查看>>
Linux中iptables详解
查看>>
java中回调函数以及关于包装类的Demo
查看>>
maven异常:missing artifact jdk.tools:jar:1.6
查看>>
终端安全求生指南(五)-——日志管理
查看>>
Nginx 使用 openssl 的自签名证书
查看>>
创业维艰、守成不易
查看>>