栈
头文件
#include "mln_stack.h"
模块名
stack
函数/宏
mln_stack_init
mln_stack_t *mln_stack_init(stack_free free_handler, stack_copy copy_handler);
typedef void (*stack_free)(void *);
typedef void *(*stack_copy)(void *, void *);
描述:
初始化栈结构。
free_handler:是入栈数据的释放函数,由于入栈数据可能为自定义数据结构,因此若需释放,可对此进行设置否则置NULL。
copy_handler:复制栈节点数据。
stack_free的参数为用户自定义数据的数据结构指针。
stack_copy的参数分别为:被复制的栈节点数据的数据结构指针 和 mln_stack_dup函数的第二个参数(即用户自定义数据),这个回调函数仅在mln_stack_dup函数中被调用。
返回值:成功则返回栈指针,否则为NULL
mln_stack_destroy
void mln_stack_destroy(mln_stack_t *st);
描述:销毁栈结构,并释放栈节点内数据资源。
返回值:无
mln_stack_push
int mln_stack_push(mln_stack_t *st, void *data);
描述:将数据data压入栈st中。
返回值:成功返回0,否则返回-1
mln_stack_pop
void *mln_stack_pop(mln_stack_t *st);
描述:将栈st的栈顶元素数据弹出。
返回值:若栈内无元素则为NULL,否则为栈节点内的数据指针
mln_stack_empty
mln_stack_empty(s)
描述:判断栈是否为空。
返回值:空为非0,否则为0
mln_stack_top
mln_stack_top(st)
描述:获取栈顶元素数据。
返回值:若栈st为空则返回NULL,否则为栈顶节点内的数据指针
mln_stack_dup
mln_stack_t *mln_stack_dup(mln_stack_t *st, void *udata);
描述:完全复制栈st。udata为用户提供的额外数据。
返回值:若成功则返回新栈指针,否则返回NULL
mln_stack_iterate
int mln_stack_iterate(mln_stack_t *st, stack_iterate_handler handler, void *data);
typedef int (*stack_iterate_handler)(void *, void *);
描述:
从栈顶向栈底遍历栈st的每一个栈内元素数据。handler为数据访问函数,data为遍历时的额外用户数据。
stack_iterate_handler有两个参数,分别为:栈节点内数据指针 和 data参数。
返回值:
mln_stack_iterate:全部遍历完则返回0,否则返回-1stack_iterate_handler:若想中断遍历则返回小于0的值,否则返回值大于等于0
示例
#include "mln_stack.h"
#include <stdlib.h>
#include <assert.h>
typedef struct {
void *data1;
void *data2;
} data_t;
static void *copy(data_t *d, void *data)
{
data_t *dup;
assert((dup = (data_t *)malloc(sizeof(data_t))) != NULL);
*dup = *d;
return dup;
}
int main(void)
{
int i;
data_t *d;
mln_stack_t *st1, *st2;
assert((st1 = mln_stack_init((stack_free)free, (stack_copy)copy)) != NULL);
for (i = 0; i < 3; ++i) {
assert((d = (data_t *)malloc(sizeof(data_t))) != NULL);
assert(mln_stack_push(st1, d) == 0);
}
assert((st2 = mln_stack_dup(st1, NULL)) != NULL);
assert((d = mln_stack_pop(st1)) != NULL);
free(d);
mln_stack_destroy(st1);
mln_stack_destroy(st2);
return 0;
}