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://www.cnblogs.com/amanlikethis/p/7284560.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞