头文件: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 = ,
_QueueEmpty = ,
_QueueOperateOk =
}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 = ;
pdI_Queue->front = pdI_Queue->rear;
pdI_Queue->count = ; 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 + ) % pdI_Queue->queueCnt;
pdI_Queue->count = pdI_Queue->count + ;
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 == ))
{
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 + ) % pdI_Queue->queueCnt;
pdI_Queue->count = pdI_Queue->count - ;
return _QueueOperateOk;
}
}

测试实例:

#include "Queue.h"

typedef struct ElemTypeDef_
{
u8 e1;
u16 e2;
u32 e3;
}ElemTypeDef; QueueDef MyQueue;
ElemTypeDef MyQueueData[]; 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 ()
{
for (i = ; i < ; i++)
{
if (QueueIn(&MyQueue, &sh) == _QueueFull) break;
} for (i = ; i < ; i++)
{
if (QueueOut(&MyQueue, &sh) == _QueueEmpty) break;
}
}
}

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

FIFO队列算法的C程序实现的更多相关文章

  1. 【转】单片机系统中数字滤波的算法【C程序整理】

    随机误差是有随机干搅引起的,其特点是在相同条件下测量同一个量时,其大小和符号做无规则变化而无法预测,但多次测量结果符合统计规律.为克服随机干搅引入的误差,硬件上可采用滤波技术,软件上可以采用软件算法实 ...

  2. STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)

    1.FIFO队列   std::queue就是普通意思上的FIFO队列在STL中的模版. 1.1主要的方法有: (1)T front():访问队列的对头元素,并不删除对头元素 (2)T back(): ...

  3. 文件 FIFO队列

    <?php /** * Filefifo.php 文件型FIFO队列 */ class Filefifo { /** * $_file_data, 数据文件的路径 */ private $_fi ...

  4. 信号量和PV操作写出Bakery算法的同步程序

    面包店烹制面包及蛋糕,由n个销售员卖出.当有顾客进店购买面包或蛋糕时,应先在取号机上取号,然后等待叫号,若有销售员空闲时便叫下一号,试用信号量和PV操作写出Bakery算法的同步程序. 设计要求 1) ...

  5. 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)

    页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...

  6. 双有序队列算法——处理哈夫曼K叉树的高效算法

    算法介绍: 哈夫曼树的思路及实现众所周知,大部分是用堆来维护和实现,这种思路比较清晰,在K比较小的时候处理较快(具体例子接下来再说),而且编程复杂度不是很高,利于应用.但是,其所用的数据结构是树,是在 ...

  7. GMM算法的matlab程序

    GMM算法的matlab程序 在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

  8. GMM算法的matlab程序(初步)

    GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

  9. KFCM算法的matlab程序(用FCM初始化聚类中心)

    KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...

随机推荐

  1. 使用JDBC连接MySQL数据库的一个基本案例

    JDBC的概念(摘自百度百科) JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一 ...

  2. MMU学习总结

    待完善 一.MMU主要完成哪些事务? 二.PowerPC上的BAT.LAW是做什么用的? 三.

  3. git 入门教程之冲突合并

    如果足够幸运的话,团队成员互不影响,彼此相安无事,大家各自基于 master 分支的某个 commit 创建自己的分支,平时在分支上独立工作,等到一段时间后再合并 merge 到 master 分支, ...

  4. (转载)解决NVIDIA显卡驱动“没有找到兼容的图形硬件”的问题

    (转载)解决NVIDIA显卡驱动“没有找到兼容的图形硬件”的问题 原出处:http://www.cnblogs.com/longdouhzt/archive/2012/02/28/2370660.ht ...

  5. ubuntu 安装PG10 更新packet 创建超级账号

    ubuntu 安装PG10 更新packet 创建超级账号 安装pg10 我的环境是16.04 server版本 MAC和windows 建议使用安装包 直接官网下载 echo 'deb http:/ ...

  6. 使用VSTS的Git进行版本控制(四)——在Visual Studio中管理分支

    使用VSTS的Git进行版本控制(四)--在Visual Studio中管理分支 可以从web版Team Services Git repo 的Branches视图中管理工作.定制视图来跟踪最关注的分 ...

  7. 机器学习之EM算法(五)

    摘要 EM算法全称为Expectation Maximization Algorithm,既最大期望算法.它是一种迭代的算法,用于含有隐变量的概率参数模型的最大似然估计和极大后验概率估计.EM算法经常 ...

  8. LeetCode题解之Squares of a Sorted Array

    1.题目描述 2.问题分析 使用过两个计数器. 3.代码 class Solution { public: vector<int> sortedSquares(vector<int& ...

  9. MongoDB数据创建与使用

    MongoDB数据创建与使用 创建数据库 代码功能:读取本地文本文件,并保存到数据库中 import pymongo #连接mongo数据库 client = pymongo.MongoClient( ...

  10. 自动化测试基础篇--Selenium文件上传send_keys

    摘自https://www.cnblogs.com/sanzangTst/p/8358165.html 文件上传是web页面上很常见的一个功能,自动化成功中操作起来却不是那么简单. 一般分两个场景:一 ...