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初始化聚类中心,并求其准确度与 ...
随机推荐
- JMeter 线程组之ConcurrencyThreadGroup介绍
线程组之ConcurrencyThreadGroup by:授客 QQ:1033553122 测试环境 apache-jmeter-3.2 jmeter-plugins-manager-1.3.jar ...
- js获取选中日期的当周的周一和周日
js获取选中日期的当周的周一和周日 第一种方法(推荐): function getWeekStr(str) { // 将字符串转为标准时间格式 str2 = Date.parse(str); let ...
- Java虚拟机(四)垃圾收集算法
前言 在本系列上一篇文章中我讲到了垃圾标记算法,垃圾被标记后,GC就会对垃圾进行收集,垃圾收集有很多种算法,这篇文章就来介绍常用的垃圾收集算法的思想. 1.标记-清除算法 标记-清除算法(Mark-S ...
- 新的 Centos 服务器初始化配置
当你初次创建新的 Centos 服务器的时候, Centos 默认的配置安全性和可用性上会存在一点缺陷(运维人员往往会有初始化的脚本).为了增强服务器的安全性和可用性,有些配置你应该尽快地完成. 这篇 ...
- (转)Android 之生成图形验证码
import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; impor ...
- Scala隐式参数
Scala方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记.如果参数列表中的参数没有像往常一样传递,Scala将查看它是否可以获得正确类型的隐式值,如果可以,将自动传递. Scal ...
- mysql执行语句提示Table 'performance_schema.session_variables' doesn't exist
用管理员身份cmd进入mysql安装目录bin里,执行 mysql_upgrade -u root -p 如果杀毒软件拦截,添加为信任区
- JMeter—总结
Jmter简单总结 简单的使用篇 jmeter简单的使用 Jmeter中默认语言的显示 jmeter利用自身代理录制脚本 Jmeter运行后出现乱码 http cookie管理中cookie poli ...
- MSSQL 如何采用sql语句 获取建表字段说明、字段备注、字段类型、字段长度
转自: http://www.maomao365.com/?p=4983 <span style="color:red;font-weight:bold;">下文讲述- ...
- CentOS6.5内 Oracle 11GR2静默安装
一.修改配置文件 1.1.修改/etc/security/limits.conf文件,修改用户的SHELL的限制. 输入命令:vi /etc/security/limits.conf,将下列内容加入该 ...