栈的弹出函数pop()实现方案探讨

多日前,我在blog发表了对《多任务下的数据结构与算法》一书的评论,在与作者的探讨中,我们就栈的弹出函数设计有比较大的分歧,详见 http://blog.csdn.net/lanphaday/archive/2006/07/10/795802.aspx的评论。最近作者提出他的意见如下:
drzhouweiming发表于2006-07-10 16:51:00IP: 220.249.249.*
To恋花蝶网友: 首先得感谢你提出了很多有价值并值得探讨的问题。看得出你是一位非常热爱技术,喜欢钻研技术的人,你的帖子里的许多问题提得很有代表性,特别是对初学者来说,把这些问题讨论清楚能给他们有很大的收获,你的帖子也给我很多启示。我也发现我的书中有些问题只是给出结论,没有把相关的背景知识全部讲出来,特别是第1章的内容,由于很多内容是相关知识,讲得太多怕跑离书的主题,没有讲透原因。

你提的这些问题,有些是值得争议一番,书经过许多专家的校对和审稿,一般是不会轻易有技术错误在里面。当然计算机技术发展很快,技术更新速度也很快,每过三年,技术就会一次大的更新,即使大师的几年前作品中也会有些观点在几年后被其他人证明是错误的,我的书也不例外,由于这是我写的第一本书,欠缺之处可能更多,欢迎对书的其他部分也多提一些问题,大家好一起共同探讨。

你说的栈使用两个参数问题,我的观点如下:
1、从功能上来讲,使用两个参数和使用一个参数实现的功能是一样多的。
2、从效率方面来讲,由于栈的操作简单,函数很小,你的帖子中也提到使用两个参数降低了10%左右的效率。
当然你提出的当函数比较大时,多一个参数不会对效率产生影响的观点也是很正确的。
你提出的使用一个指针参数里面有两个成员不会降低效率也是对的,不过这样会降低使用的方便性。
3、从使用的方便性方面来讲,使用两个参数比使用一个参数要麻烦一些。如果采用指针指向两个成员的方式,函数的易用性方面会比用两个参数还要差一些。
4、目前商业的库如STL等,它的栈的弹出操作也没有返回两个参数。

以上是我的一些看法,不当之处还请指正。

BTW:欢迎有空经常到我的博客里讨论技术问题。
关于STL模板消耗内存过大问题和goto语句的问题,我会发贴子在博客里,欢迎参与讨论。
我打算新开一个贴子来谈论这个问题:
drzhouweiming,感谢你给我这么好的评价。
写书和写文章都必须是厚积薄发,你花这么大心血写这本书我也很是佩服你的。因为相信书后面的准备工作,相关的花絮也可以写成一本书了。
我想就上面的你说的3、4两条谈谈。
STL的确是没有返回两个参数,甚至没有返回参数。std::stack::pop方法的声明形式是void pop()。也许各个版本有所不同,但SGI STL和STLport是这样的。作为使用最广泛的两种STL实现,我们完全可以认为这是业界认为比较好的解决方案。我所言的STL如非特别指出,皆指STLport版本。
但是STL这种无参数的方式调用是极麻烦的。先调用empty()来判断堆栈是否为空,然后调用top()来取得栈顶元素,这时栈顶元素仍在栈中,你必须再调用pop()来将其出栈。这个empty-top-pop三步曲式的方法,比我的两参数方法还要麻烦得多,为什么STL要删简就繁,这是个耐人寻味的问题。
但std::stack的实现的确是解决了你书中那种当压入NULL指针时无法判断是栈空还是出栈成功的问题。可见这个问题是一定要解决的,而且不能通过形成程序员之间的协议——不得压入NULL来解决。
相对于你的单返回设计和STL的empty-top-pop三步曲,我所言的多返回值方案应该是两者的折衷,在效率和健壮性上都可以接受的普遍方案。当然,STL的方案更灵活一些,特别有获取栈顶元素但不想删除栈顶元素这样的变态需求时,写出来的代码非常自然优雅。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值