`
zsxxsz
  • 浏览: 451220 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

先进先出队列

阅读更多

  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/

 

个人微博:http://weibo.com/zsxxsz

QQ 群:242722074

0
0
分享到:
评论

相关推荐

    先进先出队列 FIFO

    一个循环线性地址先进先出队列(FIFO),非常适合用做通讯、任务等,具有如下特点: 1.循环队列,空间利用率非常高,不用动态分配内存,不使用链表,无内存泄漏,无内存碎片; 2.线性地址空间,直接使用memcpy进出,...

    VC++自己写的先进先出队列的例子_QueueDemo

    在编程领域,队列是一种基础且重要的数据结构,它的核心理念是“先进先出”(First In First Out,简称FIFO)。在这个“VC++自己写的先进先出队列的例子_QueueDemo”中,开发者利用VC++2008这一经典的微软开发环境,...

    一个循环线性地址先进先出队列(FIFO),

    一个循环线性地址先进先出队列(FIFO),非常适合用做通讯、任务等,具有如下特点: 1.循环队列,空间利用率非常高,不用动态分配内存,不使用链表,无内存泄漏,无内存碎片; 2.线性地址空间,直接使用memcpy进出,...

    利用Vector类(继承)编写一个先进先出的队列类Queue java实现

    ### 使用Vector类(继承)实现先进先出队列类Queue的Java实现 #### 概述 本篇文章将详细介绍如何利用Java中的`Vector`类来实现一个具有先进先出特性的队列类`Queue`。队列是一种特殊的线性表,只允许在一端进行插入...

    C语言实现的 通用FIFO 先进先出队列

    一共有三个接口 //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); 在下不才,如有不对,请大家评论啊。

    FIFO (先进先出) 队列实现 全英文

    对于JAVA 初学者 的 FIFO 队列的实现 内容详细 实例简单

    delphi中关于队列的使用QUEUE

    在Delphi编程环境中,队列(QUEUE)是一种常用的数据结构,它遵循先进先出(FIFO,First In First Out)的原则。本篇文章将深入探讨如何在Delphi中使用队列,以及通过一个实际的小例子来加深理解。 首先,我们要...

    基于TIA博途的顺序队列(FIFO)先进先出SCL算法程序(V15版本).docx

    本教程重点介绍了如何在TIA博途中使用SCL(Structured Control Language,结构化控制语言)实现一种基于顺序队列(FIFO,First-In-First-Out)的先进先出算法程序,适用于V15版本。 顺序队列是一种特殊的数据结构,...

    基于TIA博途的循环队列(FIFO)先进先出SCL语言程序算法(V15版本).docx

    循环队列,也称为FIFO(First In First Out,先进先出)队列,是一种特殊类型的线性数据结构,其特点在于数据元素按照进入队列的顺序依次出队。在工业自动化领域,尤其是在使用西门子TIA博途( Totally Integrated ...

    实现队列先进先出 源代码

    在计算机科学中,队列是一种线性数据结构,遵循“先进先出”(FIFO,First In First Out)原则。这种数据结构广泛应用于各种场景,如任务调度、数据缓冲、多线程同步等。本话题将深入探讨如何实现一个基本的队列数据...

    基于S7-1200系列PLC的FIFO先入先出队列程序.docx

    在控制逻辑中,FIFO(First In First Out,先进先出)队列是一种常见的数据结构,常用于处理数据的有序输入与输出。基于S7-1200系列PLC的FIFO队列程序设计,能够帮助我们有效地管理数据流,实现高效的数据处理。以下...

    采用优先队列式分枝限界法求解0/1背包问 题.pdf

    在讨论采用优先队列式分枝限界法求解0/1背包问题之前,我们需要先了解0/1背包问题的基本概念。0/1背包问题是一种组合优化问题,它的目标是在不超过背包总承重的前提下,从给定的一组物品中选择物品,使得选取物品的...

    易语言核心支持库编写高效率定长队列

    采用核心支持库基础代码编写,稳定高效,代码简洁明了,方便维护和升级,百万次压入弹出...先进先出模式!。在之前的版本上的一次升级,命令按照核心支持库中的“队列”进行了效仿,效率是核心支持库的N倍!。@糖心疼。

    51单片机的FIFO(先入先出)循环队列实现

    FIFO是一种数据结构,全称为First In First Out,即先进先出,类似于现实生活中的排队问题,最先排队的顾客会最先得到服务。循环队列是队列的一种特殊情况,当队列满时,可以通过操作使其从头开始再次利用,形成一个...

    06-先进先出排序.zip

    在IT领域,尤其是在自动化、工业控制以及数据管理中,"先进先出"(First In First Out,简称FIFO)是一种常见的管理策略。本教程通过西门子博图(TIA Portal)中的SCL(Structured Control Language)编程语言,提供...

    C语言_初始化队列+入队列+出队列+销毁队列

    链式队列是一种基于链表的数据结构,它具有队列的基本特性,即先进先出(FIFO)。与数组实现的队列相比,链式队列能够更灵活地处理数据,特别是在动态变化的数据集合中。 #### 二、链式队列的关键概念 - **节点...

    BlockingQueue(阻塞队列)详解

    - **FIFO (First In First Out)**:先进先出队列,按照元素加入队列的顺序来处理它们。 - **LIFO (Last In First Out)**:后进先出队列,类似于栈,最近添加的元素会被优先处理。 **3. 使用场景** - **生产者-...

    链队列题目:初始化队列+入队列+出队列+销毁队列

    以上就是链队列的基本操作实现,这些操作对于理解和处理各种数据结构问题至关重要,特别是在需要按先进先出(FIFO)原则进行操作的场景中。通过熟练掌握这些基础操作,可以进一步解决更复杂的算法问题。在实际编程中...

    MSMQ消息队列,先进先出模式

    它采用先进的先进先出(FIFO)模式,确保消息按照发送顺序进行处理,这对于那些需要顺序执行操作或者在不稳定的网络环境中保持数据完整性的情景尤为重要。 MSMQ的核心功能在于其异步通信特性,它允许应用程序在不...

Global site tag (gtag.js) - Google Analytics