先進先出隊列

  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*);
};

  有兩個初始化函數,一個是靜態初始化,一個是動態初始化(須要釋放),以下:.net

/**
 * 初始化一個給定隊列,應用能夠在棧上分配隊列,然後調用該函數進行初始化
 * @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);

 其它的輔助函數:code

 

/**
 * 返回隊列中頭部(即最新添加的)的動態對象
 * @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.hblog

ACL 下載:http://acl.sourceforge.net/隊列

 

我的微博:http://weibo.com/zsxxsz內存

QQ 羣:242722074get

相關文章
相關標籤/搜索