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 = ,
_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程序实现的更多相关文章
- 【转】单片机系统中数字滤波的算法【C程序整理】
随机误差是有随机干搅引起的,其特点是在相同条件下测量同一个量时,其大小和符号做无规则变化而无法预测,但多次测量结果符合统计规律.为克服随机干搅引入的误差,硬件上可采用滤波技术,软件上可以采用软件算法实 ...
- STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)
1.FIFO队列 std::queue就是普通意思上的FIFO队列在STL中的模版. 1.1主要的方法有: (1)T front():访问队列的对头元素,并不删除对头元素 (2)T back(): ...
- 文件 FIFO队列
<?php /** * Filefifo.php 文件型FIFO队列 */ class Filefifo { /** * $_file_data, 数据文件的路径 */ private $_fi ...
- 信号量和PV操作写出Bakery算法的同步程序
面包店烹制面包及蛋糕,由n个销售员卖出.当有顾客进店购买面包或蛋糕时,应先在取号机上取号,然后等待叫号,若有销售员空闲时便叫下一号,试用信号量和PV操作写出Bakery算法的同步程序. 设计要求 1) ...
- 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)
页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...
- 双有序队列算法——处理哈夫曼K叉树的高效算法
算法介绍: 哈夫曼树的思路及实现众所周知,大部分是用堆来维护和实现,这种思路比较清晰,在K比较小的时候处理较快(具体例子接下来再说),而且编程复杂度不是很高,利于应用.但是,其所用的数据结构是树,是在 ...
- GMM算法的matlab程序
GMM算法的matlab程序 在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...
- GMM算法的matlab程序(初步)
GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...
- KFCM算法的matlab程序(用FCM初始化聚类中心)
KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...
随机推荐
- windows查看笔记本电池使用报告
CMD 下 powercfg /batteryreport /output “C:\battery_report.html” powercfg 参数 /LIST./L 列出所有电源方 ...
- Spring学习之旅(三)Spring工作原理初探
详细的废话相信很多书籍视频资料都已经很多了,这里说几个小编个人认为对于理解Spring框架很重要的点.欢迎批评指正. 1)Spring的控制反转 先说说“依赖”,在面向对象程序设计中,类A中用到了类B ...
- C# 利用ReportViewer生成报表
本文主要是利用微软自带的控件ReportViewer进行报表设计的小例子,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点: ReportViewer :位于Microsoft.Reportin ...
- Android为TV端助力 帧动画
首先在res/drawable/name1.xml/定义一组图片集合: <?xml version="1.0" encoding="utf-8"?> ...
- Git忽略规则及.gitignore规则不生效的解决办法(转)
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一个匹配的规则例如: 1 2 3 ...
- SSL里的certificate格式资料小结
在查看相关报文的时候,发现RFC5246本身并没有对certificate的格式AlgorithmIdentifier作深入的介绍,只说其格式必须是X509v3 DER表示,思虑良久才找到方向:后者的 ...
- 服务器CPU繁忙或内存压力引起网络掉包的浅析与总结
最近一段时间遇到了两起有意思的故障,现象都是网络掉包或网络断开,不过这些只是表面现象,引起现象出现的本质才是我们需要关注的重点: 案例1: 平台 :VMware平台 操作系统 :Windows ...
- mssql sqlserver update delete表别名用法简介
转自:http://www.maomao365.com/?p=6973 摘要: 在sql脚本编写中,如果需要在update delete 中使用表别名的方法,必须按照一定的规则编写,否则将会出现相应 ...
- python len()函数的用法
函数:len() 返回字符串.列表.字典.元组等长度. 语法:len(str) str:要计算的字符串.列表.字典.元组等 返回值:字符串.列表.字典.元组等元素的长度. Test: 1:计算字符串的 ...
- idea2018版tomcat基本配置
前言 在配置tomcat之前,要先创建一个javaweb的工程 打开idea的主界面,在菜单中点击File,出现以下的图 点击选择 Application Server 点击选择 Tomcat Ser ...