这回真的是后记了,也就是到了这些文章结束的时候了。虽然还有排序和查找两大算法系没有讲,但是对于“数据结构”而言,上面应该是全部了。并且这些文章加在一起已经很长了,每次打开WORD来编辑,跳到末页总是不那么顺畅,是到了结束的时候了。对于那两大算法系,我准备另外再开一个系列,姑且就叫做《数据结构学习(C++)续》吧。突然发现,在安排文章结构上不知不觉的受了《计算机编程艺术》的影响了。
我的参考书主要是三本,《数据结构(用面向对象方法与C++描述)》(殷人昆等),《数据结构(C语言版)》(严蔚敏、吴伟民),《数据结构算法与应用-C++语言描述》(中译名,详细信息可查china-pub)。
能写完这些文章,首先要感谢C++语言,如果让我拿C来写,没准中途就放弃了。前不久还看到有人争论数据结构用什么语言描述最合适,有人还在坚持用C最好,按照他的看法,汇编没准是最好的(有兴趣可以看看《计算机编程艺术》是拿什么语言写的)。从ADT的思想来看,C是不合适的,因为C要把数据和数据上的操作封装在一起非常的麻烦,并且只有利用文件来组织这种关系,而对于初学者来说,多模块编译链接本身就是一个很玄的事,当年学C语言的时候这部分都没敢看。而C++的类能非常完美的表达ADT的思想,并且模板、重载、继承能更清晰的表述数据结构之间的联系。关于C++在解决问题上比C的优势,可以看看《C++沉思录》,有非常有说服力的例子,当然,从运行效率来说,C要强于C++。
然而当选用了C++之后,有件事就非常尴尬了,就是STL。常用的数据结构、算法都已经作为C++标准的一部分了,我就看到一本书是用STL来描述数据结构的(只看到了书名,没看到内容)。前面的三部分,线性表在STL里全部都有现成的(变长数组、链表、队列、栈),二叉搜索树在SGI-STL里有红黑树的实现,只有图标准库没有提供,但是图最重要的是一堆算法。排序、查找在STL里也有现成的。
这让我想起了“程序员=民工”的论调,的确,现在的语言、开发工具在给程序员提供了便利的同时,也限制了程序员的思维,养成了他们的惰性。现在编程就是在Framework里面改写若干的函数,在我们感到这种方式的便利的同时,也越来越感到自己力量的渺小。也许人就是种奇怪的动物。
或许数据结构这门课程根本就不是让你掌握那些链表、树是如何实现的。开设这门课第一个目的是让你懂得“数据结构+算法=程序”,第二个目的是培养数据抽象的能力。当这两个目的达到的同时,你也就具备了解决现实未知问题的能力,遗憾的是,大多数连掌握已有的数据结构的目标都没达到。出于这个原因,我总是建议你看看《计算机编程艺术》,这部有无数赞誉的巨著。最好不要买纸版的,弄个电子版就行了,纸版的恐怕会吓得你不敢看,^_^。正如盖茨说的,这本书很有趣,如果你不把它当成参考书,你一定会有新的体会。
所有的源程序都已打包,MyDS是线性链式结构,MyTree是树结构,Graph是图结构。加上这系列的WORD文档,打成一个zip包,初步计划放到C++中国联盟的FTP上,下面是论坛的网址http://www.cppcn.com/bbs/
要想学好数据结构,最好亲自把所有的算法完成一遍,从这个角度说,我的源程序有负面作用。我的初衷是使那些照书调不出来的不会因为写不出程序而影响了学习的信心,毕竟书上的错漏在所难免,对自学的人和在照本宣科老师手下饱受煎熬的人来说,我的源程序应该能起到预期的作用。
本系列到此结束,续篇再见吧。