ACL库中有个模块实现了先进先出队列的功能,其使用方法非常简单,下面是结构定义:
struct ACL_FIFO { ACL_FIFO_INFO *head; ACL_FIFO_INFO *tail; int cnt; /* for acl_iterator */ /* 取迭代器头函数 */ const void *(*iter_head)(ACL_ITER*, struct ACL_FIFO*); /* 取迭代器下一个函数 */ const void *(*iter_next)(ACL_ITER*, struct ACL_FIFO*); /* 取迭代器尾函数 */ const void *(*iter_tail)(ACL_ITER*, struct ACL_FIFO*); /* 取迭代器上一个函数 */ const void *(*iter_prev)(ACL_ITER*, struct ACL_FIFO*); /* 取迭代器关联的当前容器成员结构对象 */ const ACL_FIFO_INFO *(*iter_info)(ACL_ITER*, struct ACL_FIFO*); };
有两个初始化函数,一个是静态初始化,一个是动态初始化(需要释放),如下:
/** * 初始化一个给定队列,应用可以在栈上分配队列,而后调用该函数进行初始化 * @param fifo {ACL_FIFO *} * @example: * void test(void) { ACL_FIFO fifo; acl_fifo_init(&fifo); * } */ ACL_API void acl_fifo_init(ACL_FIFO *fifo); /** * 从内存堆中分配一个队列对象,需要用 acl_fifo_free 释放 * @return {ACL_FIFO*} */ ACL_API ACL_FIFO *acl_fifo_new(void); /** * 释放以堆分配的队列对象 * @param fifo {ACL_FIFO*} * @param free_fn {void (*)(void*)}, 如果该函数指针不为空则 * 用来释放队列中动态分配的对象 */ ACL_API void acl_fifo_free(ACL_FIFO *fifo, void (*free_fn)(void *));
向队列中添加及获得对象的函数如下:
/** * 向队列中添加一个动态堆对象 * @param fifo {ACL_FIFO*} * @param data {void*} 动态对象 */ ACL_API void acl_fifo_push(ACL_FIFO *fifo, void *data); /** * 从队列中以先进先出方式弹出一个动态对象, 同时将该对象从队列中删除 * @param fifo {ACL_FIFO*} * @return {void*}, 如果为空,则表示队列为空 */ ACL_API void *acl_fifo_pop(ACL_FIFO *fifo);
其它的辅助函数:
/** * 返回队列中头部(即最新添加的)的动态对象 * @param fifo {ACL_FIFO*} * @return {void*}, 如果为空,则表示队列为空 */ ACL_API void *acl_fifo_head(ACL_FIFO *fifo); /** * 返回队列中尾部(即最早添加的)的动态对象 * @param fifo {ACL_FIFO*} * @return {void*}, 如果为空,则表示队列为空 */ ACL_API void *acl_fifo_tail(ACL_FIFO *fifo); /** * 返回队列中动态对象的总个数 * @param fifo {ACL_FIFO*} * @return {int}, >= 0 */ ACL_API int acl_fifo_size(ACL_FIFO *fifo);
下面是一个简单的例子:
#include "lib_acl.h" #include <stdio.h> #include <stdlib.h> static void fifo_test(void) { ACL_FIFO *fifo; int i; char *ptr; ACL_ITER iter; fifo = acl_fifo_new(); // 创建队列 for (i = 0; i < 20; i++) { ptr = (char*) acl_mymalloc(100); snprintf(ptr, 100, "test:%d", i); acl_fifo_push(fifo, ptr); // 向队列中添加动态元素 } // 遍历队列中的所有元素 acl_foreach(iter, fifo) { const char *ptr = (const char*) iter.data; printf(">>>%s\n", ptr); } while (1) { ptr = (char*) acl_fifo_pop(fifo); // 从队列中取得动态元素 if (ptr == NULL) break; printf("fifo pop: %s\n", ptr); } acl_fifo_free(fifo, acl_myfree_fn); // 释放队列 } int main(int argc acl_unused, char *argv[] acl_unused) { fifo_test(); getchar(); return (0); }
这个例子非常简单,只是演示了如何使用ACL库中的先进先出队列。头文件参看:lib_acl/include/stdlib/acl_fifo.h
ACL 下载:http://acl.sourceforge.net/
QQ 群:242722074
相关推荐
一个循环线性地址先进先出队列(FIFO),非常适合用做通讯、任务等,具有如下特点: 1.循环队列,空间利用率非常高,不用动态分配内存,不使用链表,无内存泄漏,无内存碎片; 2.线性地址空间,直接使用memcpy进出,...
该程序使用VC++2008实现了先进先出队列的工作原理,对处理大量需要等待的数据非常有用
一个循环线性地址先进先出队列(FIFO),非常适合用做通讯、任务等,具有如下特点: 1.循环队列,空间利用率非常高,不用动态分配内存,不使用链表,无内存泄漏,无内存碎片; 2.线性地址空间,直接使用memcpy进出,...
java实现的利用Vector类(继承)编写一个先进先出的队列类Queue,它有两个方法:入队inqueue和出队outqueue。(在主方法中使用该队列: “111”、“222”入队,出队一元素,“333”入队,最后出队所有元素。
一共有三个接口 //P_FIFO_T FIFO_Creat(int nNodeMax, int nNodeSize); //void FIFO_Push(P_FIFO_T hFifo, void *pvBuff); //char * FIFO_Pop(P_FIFO_T hFifo); 在下不才,如有不对,请大家评论啊。
对于JAVA 初学者 的 FIFO 队列的实现 内容详细 实例简单
基于TIA博途的顺序队列(FIFO)先进先出SCL算法程序(V15版本)
基于S7-1200系列PLC的FIFO先入先出队列程序
基于TIA博途的循环队列(FIFO)先进先出SCL语言程序算法(V15版本)
创建队列、写数据、取数据、删除队列;完全实现先进先出机制,可直接使用
采用优先队列式分枝限界法求解0/1背包问题,算法设计第五章,描述的很清晰,里面有完整代码,由于害怕你弄混,所以完整运行的代码参考我的博客文章即可
采用核心支持库基础代码编写,稳定高效,代码简洁明了,方便维护和升级,百万次压入弹出...先进先出模式!。在之前的版本上的一次升级,命令按照核心支持库中的“队列”进行了效仿,效率是核心支持库的N倍!。@糖心疼。
本文给大家分享了51单片机的FIFO(先入先出)循环队列实现的源代码。
主要介绍了JS实现队列的先进先出功能,结合实例形式分析了基于JS的队列初始化、赋值等相关操作技巧,需要的朋友可以参考下
队列。 例子 创建一个队列,其中一个生产者和两个消费者做假工作: var Queue = require ( 'co-queue' ) ; var co = require ( 'co' ) ; var wait = require ( 'co-wait' ) ; var queue = new Queue ; co ( function...
windows自带的消息队列,MSMQ类为发送消息,MSMQ_Receive类库为接收消息,此工程简单,为初学者提供教程和程序,1积分求打赏,谢谢!
First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用...
该程序实现的是8*8位的先进先出队列功能的存储器,已成功通过仿真。
编写一个JAVA的队列类