`
zsxxsz
  • 浏览: 444581 次
  • 性别: 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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics