ds通用stack(1.2)

现在我们来讲如何C语言宏以外的其他方法来实现这个通用的STACK, 通常我们会在对应的头文件里面声明相应操作该STACK的接口, 接口如下:

struct _ds_stk;

extern struct _ds_stk* ds_stk_new(struct _ds_stk_f dsf);

extern void ds_stk_free(struct _ds_stk** pds);

extern size_t ds_stk_size(struct _ds_stk* stk);

extern int ds_stk_empty(struct _ds_stk* stk);

extern int ds_stk_push(struct _ds_stk* stk, void* dat);

extern int ds_stk_pop(struct _ds_stk* stk, void* val);

这里出现了一个陌生的东西——struct _ds_stk_f,我们姑且认为它是初始、创建该STACK对象的相关初始化信息吧。

下面我们再来讨论, 使用void指针来构建通用STACK的难点, 我们到底该存储指针还是拷贝具体的值呢? 这是一个问题, 在STL里面, 其中的机制帮助我们进行了拷贝, 但是在C语言里面, 这一切都需要我们自己来完成。

这里还有另一个难点, 如果我们存指针, 那客户指针析构后, 那STACK里面存储的东西边毫无意义了。那好, 我们似乎只好存储具体的拷贝了, 但是我们怎么知道客户需要存储的数据的空间是多少呢? 对, 我们确实不知道, 但是客户是知道的, 那吧拷贝的操作丢给客户来操作不就得了。所以, 我们的struct _ds_stk_f就清晰了。

struct _ds_stk_f {

        _ds_alloc_func _alloc;

        _ds_free_func  _free;

        _ds_copy_func  _copy;

};

    每个函数的具体类型定义如下:

typedef void* (*_ds_alloc_func)(void*);

typedef void  (*_ds_free_func)(void*);

typedef void  (*_ds_copy_func)(void*, void*);

_ds_alloc_func 主要是为客户新添加的数据信息申请相应的空间, 以存储到STACK中, _ds_free_func 是与 _ds_alloc_func 相对应的, 释放客户所申请的存储数据的空间, _ds_copy_func 则是进行数据的拷贝, 在 ds_stk_pop 这个接口中我们将使用到, 主要是将数据拷贝到客户的空间, 以便客户进行相应的处理。

    好了, 今天就先讲这些吧, 聪明的你或许已经看看出我的意图了吧, 不妨自己实现看看。如果你又更好的见解, 希望你可以不吝赐教。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值