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;
  }
}

 

測試實例:spa

#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語言實現.net

相關文章
相關標籤/搜索