《高等学校计算机课程规划教材:数据结构与算法教程(C++版)》合c++面向对象程序设计的特点,构建了数据结构与算法,书中的所有算法都在visualc++6.0、visualc++2005、visualc++2005express、dev-c++和mingwdeveloperstudio开发环境中进行了严格的测试,而且,在作者个人网页上提供了大量的教学支持内容。
《高等学校计算机课程规划教材:数据结构与算法教程(C++版)》共分11章,第1章是基础知识,介绍基本概念及其术语,讨论实用程序软件包;第2章引入线性表;第3章介绍栈和队列,用栈实现表达式求值;第4章介绍串,详细讨论串的存储结构与模式匹配算法;第5章介绍数组和广义表,首次提出了广义表的使用空间表存储结构;第6章介绍树结构,应用哈夫曼编码实现压缩软件;第7章介绍图结构,实现图的常用存储结构,讨论图的相关应用,并实现相应算法;第8章介绍查找,讨论静态查找表、动态找查表与散列表,并实现了所有算法;第9章介绍排序,以简洁方式实现各种排序算法;第10章介绍文件,讨论各种常用文件结构;第11章介绍算法设计技术与算法分析技术。
《高等学校计算机课程规划教材:数据结构与算法教程(C++版)》在内容组织上特别考虑了读者的可接受性;在算法实现时,重点考虑了程序的可读性;并且在习题、上机实验或课程设计中进一步实现更强的功能。通过《高等学校计算机课程规划教材:数据结构与算法教程(C++版)》学习,读者不但能迅速提高数据结构与算法的水平,还能提高c++程序设计的能力,经过适当的选择,《高等学校计算机课程规划教材:数据结构与算法教程(C++版)》可以作为数据结构、数据结构与算法分析、数据结构与算法设计、数据结构与算法等课程的教材,《高等学校计算机课程规划教材:数据结构与算法教程(C++版)》可作为高等院校计算机及相关专业的教材,也可供其他从事软件开发工作的读者学习参考使用。
数据结构与算法内容丰富,技巧性强,包含了计算机科学与技术的许多重要方面,对学生的计算机软件素质的培养作用明显。
本书采用C++面向对象的观点介绍数据结构与算法,并使用模板程序设计技术,与传统采用面向过程的观点相比优势较大,使所设计的程序更容易实现代码重用,在提供通用性和灵活性的同时,又保证了效率。本书将面向对象程序设计的思想融合到数据结构与算法中,读者通过学习可进一步提高面向对象程序设计的能力。
全书共分为11章,第1章是基础知识,介绍基本概念及其术语、抽象数据类型的实现,还讨论算法的概念和算法分析的简单方法。作为预备知识,读者应具有一定的C++程序设计的基础。但为了降低读者的门槛,本章还介绍了要用到的C++的主要知识点,并介绍了实用程序软件包。
第2章引入线性表,详细讨论线性表的顺序存储结构与链式存储结构。在讨论链式存储结构时,首先仿照传统方法实现线性表,在此基础之上,在链表结构中保存当前位置和元素个数,这样在难度增加不大的情况下提高了算法效率,使学生逐步体会改进算法的途径与方法。
第3章介绍栈和队列,讨论栈和队列的顺序存储结构与链式存储结构,用栈实现表达式求值,通过学习能掌握各种栈和队列的实现与使用方法,对后继课程(如操作系统原理和编译原理)的学习打下良好基础。本章还讨论了优先队列,使队列应用更加广泛。
第4章介绍串,详细讨论串的存储结构与模式匹配算法,为开发串应用软件(如实现文本编辑软件)打下坚实的基础。
第5章介绍数组和广义表,详细讨论数组、特殊矩阵、稀疏矩阵和广义表的存储结构及实现方法,首次提出了广义表的使用空间表存储结构,并使用广义表实现m元多项式的表示。
第6章介绍树结构,讨论了二叉树、线索二叉树、树、森林及其哈夫曼树的结构及其实现,还用哈夫曼编码实现了压缩软件。
第7章介绍图结构,实现图的常用存储结构,并讨论图的相关应用,实现相应算法(如求最小生成树的Prim算法与Kruskal算法,求最短路径的Dijkstra算法与Floyd算法).
第8章介绍查找,讨论静态查找表、动态查找表与散列表,还讨论二叉排序树、二叉平衡树与B树,并实现所有算法。
第9章介绍排序,以简洁方式实现各种排序算法,还测试了各种排序算法的实际运行时间。
第10章介绍文件,讨论主存储器和辅助存储器,以及各种常用文件结构,还特别介绍在数据库中经常采用的VSAM文件,对读者研究与学习数据库有一定的帮助。
第11章介绍算法设计技术与算法分析技术,详细讨论各种算法设计技术的使用方法并实现了各种算法,并对算法分析技术进行深入浅出的讨论。对读者的算法设计和算法分析的理论和实践都有极大的帮助。
对于初学者,要完全独立编写数据结构与算法的代码是相当困难的,因此本书讨论的数据结构与算法都加以实现并进行了严格测试,提供了完整的测试程序,读者可参考这些测试程序编写相关算法,但如果只会使用已有的数据结构编写简单的程序也不利于读者对数据结构与算法的深入理解,提高研究新数据结构与算法的能力。因此本书的习题不但包括基本练习题,还包括仿照书中数据结构构造新数据结构的题目,或改造已有算法的题目,这样使读者具有构造新结构及改造或改进算法的能力。
本书各章还提供了实例研究,这些实例研究包含教材基础内容的应用(例如第4章的实例研究--文本编辑,第3章的实例研究--表达式求值等),也包含教材正文内容的补充(例如第6章的实例研究--树与等价关系)。实例研究主要提供给那些精力充沛的学生深入学习与研究,读者通过对实例研究的学习,可提高实际应用数据结构与算法的能力,虽然有一定的难度,但应比读者的想象更易学习与掌握。
为了尽快提高读者的学习能力,本书各章还提供了深入学习导读,包括本书作者实现相关数据结构与算法的最原始思想的资料来源,也包括进一步学习的参考资料,极大地方便了读者与教师查阅资料。
为了加强实践教学的需要,本书的附录中提供了实验题目与课程设计项目,并提供了实验报告格式与课程设计报告格式,以便学生在做数据结构与算法的实验与课程设计时选择,也为教师提供了可供参考的实验与课程设计的素材。
本教材在内容组织上特别考虑了读者的可接受性;在算法实现时,重点考虑程序的可读性,教材基本内容的算法一般选择最简单实现方式,学生容易接受;一般采用启发的方式在习题、上机实验或课程设计中进一步实现更强的功能,这样容易培养起读者的学习兴趣,使读者感到自己具有能发展或改进已有算法的能力,也会使读者感到自己已具有计算机高手的实力。
本书的作者都活跃在教学研究第一线上,有的作者还具有深厚的数学功底,不但完成了所有算法的测试程序,还对算法分析的相关公式进行了严格的数学推理。
本书采用了模板程序设计技术,模板技术已成为现代C++语言的风格基础,C++98(1998年标准化的C++)提供的标准程序库中有80%的成分是使用模板机制实现的STL(Standard Template Library,标准模板库)。而国内现阶段教学并未重视C++的模板程序设计,书籍资料也不是很多。作者认为在C++中,只要模仿本书算法,读者会在不知不觉中就掌握了模板程序设计技巧。
现在来讨论一下在国外数据结构与算法教材中上机时喜欢采用的STL。实际上,STL是ATandT贝尔实验室和HP研究实验室的研究人员将模板程序设计和面向对象程序设计的原理结合起来,创造的一套研究数据结构与算法的统一方法,现在已成为C++标准库的一部分。STL提供了实现数据结构的新途径。它将(数据)结构(即组织数据的存储结构)抽象为容器。通过使用模板和迭代器,STL库使程序员能够将广泛的通用算法应用到各种容器类上。通过本书作者的研究与了解,STL库只覆盖了数据结构中的线性结构和树结构,并没有覆盖图部分,因此,对数据结构来讲,STL库并不完备,同时,如果读者上机编程都只使用STL库解决数据结构的相关算法,可能使读者在数据结构编程方面,只会使用STL库,而不能独自设计新数据结构。本书采用模板方法实现了所有书中的数据结构算法,应比STL库更完备;同时STL库中包含的源代码可读性差,不适合作为教学使用,本书的算法源程序首要强调可读性,使读者容易接受与模仿,并且可进行改进或修改算法实现,因此在某种意义上讲,本书提供的关于数据结构与算法实现的类模板与函数模板是一种GTL (General Template Library)或OSGTL (Open Source General Template Library) ,读者也可从作者个人主页提供的软件包(具体内容见附录B)来进行实际数据结构与算法方面的软件开发;当然,通过本书的学习,再返回来学习STL库的应用,将会事半功倍,读者只要找一本介绍STL的书籍或网上找一些介绍使用STL库的文档,并用STL库试着编程即可完全掌握STL库的使用。
特别要提一下有关C++编译器的问题。在C++之外的任何编程语言中,编译器都没有受到过如此之重视,这是因为C++是一门非常复杂的语言,以致编译器也难于构造。下面介绍一些常用的优秀C++编译器。
Visual C++编译器:由微软开发,现在主要流行Visual C++ 6.0、Visual C++ 2005以及Visual C++ 2005 Express,特点是集成开发环境用户界面友好,信息提示准确,调试方便,对模板支持最完善;Visual C++ 6.0对硬件环境要求低,现在安装的机器最多,但对标准C++兼容只有83.43%, Visual C++ 2005与Visual C++ 2005 Express在软件提示信息上做了进一步的优化与改进,并且对标准C++兼容程度达到了98%以上,但对硬件的要求较高;还有Visual C++ 2005 Express是一种轻量级的Visual C++软件,易于使用。对于编程爱好者、学生和初学者来说是很好的编程工具,微软在2006年4月22日正式宣布 Visual Studio 2005 Express版永久免费。
GCC编译器:著名的开源C++编译器。是在UNIX操作系统(例如Linux)下编写C++程序的首选,有非常好的可移植性,可以在非常广泛的平台上使用,也是编写跨平台、嵌入式程序很好的选择。GCC 3.3与标准C++兼容程度大概能够达到96.15%。现已有一些移植在Windows环境下使用GCC编译器的IDE(集成开发环境),例如Dev-C++与MinGW Developer Studio,其中Dev-C++是能够让GCC在Windows下运行的集成开发环境,提供了与专业IDE相媲美的语法高亮、代码提示与调试等功能;MinGW Developer Studio是跨平台下的GCC集成开发环境。目前支持 Windows、Linux和 FreeBSD;根据作者的实际使用,感觉使用GCC编译器的IDE错误信息提示的智能较低,错误提示不太准确,还有就是对模板支持较差,对语法检查较严格,有些在Visual C++编译器中编译通过的程序可能在GCC编译器的IDE还会显示有错误信息。
本书所有算法都同时在Visual C++ 6.0、Visual C++ 2005、Visual C++ 2005 Express、Dev-C++和MinGW Developer Studio中通过测试。读者可根据实际情况选择适当的编译器,建议选择Visual C++ 6.0.
教师可采取多种方式来使用本书作为讲授数据结构、数据结构与算法分析、数据结构与算法设计、数据结构与算法等课程,应该根据学生的背景知识以及课程的学时数来进行内容的取舍。为满足不同层次的教学需求,本教材使用了分层的思想,分层方法如下:没加有星号*及双星号**的部分是基本内容,适合所有读者学习;加有星号的部分是适合计算机专业的读者深入学习的选学部分;加有双星号的部分适合于感兴趣的同学研究,尤其适合于那些有志于ACM竞赛的读者加以深入研究。
作者为本书提供了全面的教学支持,如果在教学或学习过程中发现与本书有关的任何问题都可以与作者联系:youhongyue168@gmail.com,作者将尽力满足读者的要求,并可能将解答公布在作者的教学网站http://teachhelp.changeip.net:9988/或http://teachhelp.3322.org:9988/上。在教学网站上还将提供如下内容:
(1) 提供书中所有算法在Visual C++ 6.0、Visual C++2005、Visual C++2005 Express、Dev-C++和MinGW Developer Studio开发环境中的测试程序,今后还会提供当时流行的C++开发环境的测试程序,每种开发环境还将提供基本开发过程的文档;还提供本书作者开发的软件包(包含所有本书所讲的数据结构与算法的类模板与函数模板).
(2) 提供教学用Power Point幻灯片ppt课件。
(3) 向教师提供所有习题、上机实验题与课程设计项目的解答或参考程序;对学生来讲,将在每学期期末(第15周~第20周)公布解压码。
(4) 数据结构与算法问答专栏。
(5) 提供至少8套数据结构与算法模拟试题及其解答,以供学生期末及考研复习,也可供教师出考题时参考。
(6) 提供数据结构与算法相关的其他资料(例如Dev-C++与MinGW Developer Studio软件,流行免费C++编译器的下载网址等).
希望各位能够抽出宝贵的时间将你对本教材的建议或意见,当然也可以发表对国内外的数据结构与算法课程教学的任何意见寄给作者,你的意见将是我们再版修订教材的重要参考。
张卫华、彭骏、谭斌、李培宇、何凯霖、姜琳、聂清彬、黄维、邹昌文、王文昌、周焯华、胡开文、沈洁、周德华与欧阳等人对本书做了大量的工作,包括提供资料,调试算法,参与了部分内容的编写,在此特向他们表示感谢;作者还要感谢为本书提供直接或间接帮助的每一个朋友,由于你们热情的帮助或鼓励,激发了作者写好本书的信心以及写作热情。
本书的出版要感谢清华大学出版社各位编辑及评审专家,由于他们为本书的出版倾注了大量热情,也由于他们具有前瞻性的眼光才让读者有机会看到本书。
尽管作者有良好而负责任的严格态度,并做出了最大努力,但由于作者水平有限,书中难免有不妥之处,因此,敬请各位读者不吝赐教,以便作者有一个提高的机会,并在再版时尽量采用你们的意见。
编 者2012年10月
第1章 绪论
1.1 数据结构的概念和学习数据结构的必要性
1.2 数据结构的基本概念
1.3 抽象数据类型及其实现
1.4 算法和算法分析
1.5 实用程序软件包
1.6 深入学习导读
1.7 习题
第2章 线性表
2.1 线性表的逻辑结构
2.2 线性表的顺序存储结构
2.3 线性表的链式存储结构
2.4 实例研究: 一元多项式的表示
2.5 深入学习导读
2.6 习题
第3章 栈和队列
3.1 栈
3.2 队列
3.3 实例研究: 表达式求值
3.4 深入学习导读
3.5 习题
第4章 串
4.1 串类型的定义
4.2 字符串的实现
4.3 字符串模式匹配算法
4.4 实例研究: 文本编辑
4.5 深入学习导读
4.6 习题
第5章 数组和广义表
5.1 数组
5.2 矩阵
5.3 广义表
5.4 深入学习导读
5.5 习题
第6章 树和二叉树
第7章 图
第8章 查找
第9章 排序
第10章 文件
第11章 算法设计与分析
参考文献