多日前,我在blog发表了对《多任务下的数据结构与算法》一书的评论,在与作者的探讨中,我们就栈的弹出函数设计有比较大的分歧,详见http://blog.csdn.net/lanphaday/archive/2006/07/10/795802.aspx的评论。最近作者提出他的意见如下:
drzhouweiming 发表于2006-07-10 16:51:00  IP: 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的方案更灵活一些,特别有获取栈顶元素但不想删除栈顶元素这样的变态需求时,写出来的代码非常自然优雅。

栈的弹出函数pop()实现方案探讨相关推荐

  1. java输出栈的弹出序列_剑指offer:栈的压入、弹出序列(Java)

    1.题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是 ...

  2. 复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值

    栈和队列的概念 栈:吃进去吐出来 对列:吃进去拉出来 数据结构中的栈和内存中的区别 数据结构中的栈具有后进先出的特性,而内存中的栈是一个内存空间,只不过这个内存空间具与数据结构的栈具有相同的特性. 栈 ...

  3. 《剑指offer》:[22]如何判断一个序列是否为栈的弹出序列

    题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序. 假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压栈序列,序列4,5,3,2,1是该压栈序列 ...

  4. 火车进站(全排列+栈的弹出压进序列)

    给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号,火车站只有一个方向进出,同时停靠在火车站的列车中,只有后进站的出站了,先进站的 ...

  5. php弹出编辑框,PHP弹出对话框的技巧方案

    我们在实现PHP弹出对话框之后,一般还需要返回原来页面或者用新的页面替换原来的页面等,本文将会讲解详细代码编写,需要的朋友可以参考下 许多程序员们运用PHP语言进行WEB开发.那么在网站中通常都会遇到 ...

  6. 【JSConf EU 2018】有关浏览器弹出式窗口的相关探讨

    在前端大爆发的今天,随着层出不穷的新技术和新框架的不断推出和W3C标准的不断更新,前端开发已经不局限于展示服务端返回的信息,而更多的去关注功能,这也带给了我们更多思考. 本次JSCONF2018大会上 ...

  7. 数据结构与算法--举例分析法- 栈的压入弹出序列

    举例分析 与上两篇问中画图方法一样,我们可以用举例模拟的方法思考分析复杂问题.当一眼不能看出问题的规律的时候,我们可以用几个具体的例子来模拟一下问题的过程.这样就和我们在程序出现问题时候的debug一 ...

  8. 剑指offer:面试题31. 栈的压入、弹出序列

    题目:栈的压入.弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 ...

  9. 剑指offer22:栈的压入、弹出序列

    题意: 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2, ...

最新文章

  1. php概率函数,PHP全概率运算函数(优化版) Webgame开发必备
  2. 【周报6.10-6.16】NLP,RL,GAN,DL框架等重磅专栏齐上线,这个月的有三AI你值得拥有...
  3. python数值运算符也叫内置运算符_Python全栈工程师(数值类型、运算符)
  4. Oracle_零度笔记
  5. 项目集成Spring Security
  6. 吃鸡11月15服务器维护,绝地求生11月20日维护到几点 11.20吃鸡更新维护公告
  7. velocity java 静态方法_java – 如何访问Velocity模板中的静态成员?
  8. 【C++游戏引擎Easy2D】基于基础类型学习使用核心Game+Window+Input详解
  9. 老鱼Python数据分析——篇一:项目立项
  10. SAS更新sid的方法,简单有效,sid最新可到2022年3月
  11. 关于web的重定向,js实现重定向的方法
  12. 混沌数学之Lorenz(洛伦茨)吸引子
  13. Linux之压缩解压缩
  14. mybatis入门1
  15. undi是什么意思_undefined什么意思?
  16. JavaCV 制作字符画
  17. 黑暗城堡 LibreOJ - 10064(SPFA)
  18. 那些年啊,那些事——一个程序员的奋斗史 ——17
  19. 学习笔记-磁盘存储管理
  20. 前端超出文字显示省略号

热门文章

  1. ProGuard的作用、使用及bug分析
  2. OpenCV之图像膨胀:dilate函数(C++实现)
  3. Python笔记:数据集拼接(数据匹配)
  4. 计算某个月的月初和月末
  5. 服务器删除系统痕迹,win10怎么清除使用痕迹_网站服务器运行维护
  6. php继承exten,jQuery的extend方法【三种】
  7. rm 命令过滤式删除
  8. #PCIE# PCIe的接口形态之M.2接口
  9. havc是什么意思_HVAC系统是什么?
  10. Valve现在说Steam将“像样”支持Ubuntu 19.10