zoukankan      html  css  js  c++  java
  • FIFO队列算法的C程序实现

    头文件:Queue.h

    #ifndef _Queue_H
    #define _Queue_H
    
    typedef 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;
        }
      }
    }

    参考资料:fifo的c语言实现

  • 相关阅读:
    数字签名与HTTPS详解
    利用策略模式优化过多 if else 代码
    Redis 的事务到底是不是原子性的
    Spring Boot项目的接口防刷
    深入分析 ThreadLocal
    什么是四层和七层负载均衡?他们之间的区别是什么?
    MyEclipse或Eclipse中project的导入和导出
    org.hibernate.exception.ConstraintViolationException: could not insert:
    C++ STL vector(向量容器)的使用(附完整程序代码)
    Swift2.0语言教程之函数嵌套调用形式
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/7284560.html
Copyright © 2011-2022 走看看