图书简介:
目 录
第1章 绪论 1
1.1 数据结构的基本概念 1
1.1.1 为什么要学习数据结构 1
1.1.2 什么是数据结构 1
1.1.3 数据类型与抽象数据类型 5
1.2 算法 8
1.2.1 什么是算法 8
1.2.2 算法分析 9
1.2.3 算法设计 12
习题1 15
实验1 算法设计与分析 16
第2章 线性表 17
2.1 线性表抽象数据类型 17
2.2 线性表的顺序存储和实现 18
2.2.1 线性表的顺序存储结构 18
2.2.2 顺序表 18
2.2.3 排序顺序表 29
2.3 线性表的链式存储和实现 37
2.3.1 线性表的链式存储结构 37
2.3.2 单链表 38
2.3.3 双链表 47
2.4 线性表应用:多项式的表示及运算 51
2.4.1 一元多项式的表示及运算 52
2.4.2 二元多项式的表示及运算 56
习题2 58
实验2 线性表的基本操作 58
第3章 串 61
3.1 串抽象数据类型 61
3.2 串的存储和实现 62
3.2.1 串的存储结构 62
3.2.2 常量字符串类 63
3.2.3 变量字符串类 71
3.3 串的模式匹配 74
3.3.1 Brute-Force算法 74
3.3.2 模式匹配应用 76
3.3.3 KMP算法 79
习题3 85
实验3 串的基本操作及模式匹配算法 85
第4章 栈和队列 89
4.1 栈 89
4.1.1 栈抽象数据类型 89
4.1.2 顺序栈 90
4.1.3 链式栈 90
4.1.4 栈的应用 91
4.2 队列 97
4.2.1 队列抽象数据类型 97
4.2.2 顺序队列 98
4.2.3 链式队列 100
4.2.4 队列的应用 102
4.2.5 优先队列 103
4.3 递归 105
习题4 110
实验4 栈和队列以及递归算法 111
第5章 数组和广义表 113
5.1 数组 113
5.2 特殊矩阵的压缩存储 118
5.2.1 三角矩阵、对称矩阵和对角矩阵的压缩存储 118
5.2.2 稀疏矩阵的压缩存储 120
5.3 广义表 127
5.3.1 广义表抽象数据类型 127
5.3.2 广义表的存储结构 129
5.3.3 广义表双链表示的实现 131
习题5 134
实验5 特殊矩阵和广义表的存储和运算 135
第6章 树和二叉树 137
6.1 树及其抽象数据类型 137
6.1.1 树定义 137
6.1.2 树的术语 138
6.1.3 树抽象数据类型 139
6.2 二叉树 139
6.2.1 二叉树定义 139
6.2.2 二叉树性质 140
6.2.3 二叉树的遍历规则 141
6.2.4 二叉树抽象数据类型 142
6.2.5 二叉树的存储结构 142
6.2.6 二叉树的二叉链表实现 144
6.3 线索二叉树 158
6.3.1 线索二叉树定义 159
6.3.2 中序线索二叉树 160
6.4 Huffman树 163
6.4.1 Huffman编码 163
6.4.2 Huffman树及其构造算法 164
6.5 树的表示和实现 171
6.5.1 树的遍历规则 171
6.5.2 树的存储结构 171
6.5.3 树的父母孩子兄弟链表实现 172
习题6 175
实验6 树和二叉树的基本操作 177
第7章 图 180
7.1 图及其抽象数据类型 180
7.1.1 图的基本概念 180
7.1.2 图抽象数据类型 183
7.2 图的表示和实现 184
7.2.1 图的邻接矩阵表示和实现 184
7.2.2 图的邻接表表示和实现 191
7.2.3 图的邻接多重表表示 196
7.3 图的遍历 197
7.3.1 图的深度优先搜索遍历 197
7.3.2 图的广度优先搜索遍历 200
7.4 最小生成树 201
7.4.1 生成树 201
7.4.2 最小生成树的构造算法 203
7.5 最短路径 206
7.5.1 单源最短路径 207
7.5.2 每对顶点间的最短路径 210
习题7 214
实验7 图的表示和操作 215
第8章 查找 216
8.1 查找的基本概念 216
8.2 二分法查找 218
8.3 基于索引表的分块查找 220
8.4 散列 224
8.4.1 散列表 224
8.4.2 散列映射 230
8.5 二叉排序树和平衡二叉树 233
8.5.1 二叉排序树 234
8.5.2 树映射 241
8.5.3 平衡二叉树 242
习题8 245
实验8 查找算法 247
第9章 排序 248
9.1 插入排序 248
9.1.1 直接插入排序 248
9.1.2 希尔排序 250
9.2 交换排序 251
9.2.1 冒泡排序 252
9.2.2 快速排序 253
9.3 选择排序 256
9.3.1 直接选择排序 256
9.3.2 堆排序 257
9.4 归并排序 260
9.5 线性表的排序算法 262
9.5.1 顺序表的排序算法 262
9.5.2 单链表的排序算法 263
9.5.3 循环双链表的排序算法 264
习题9 267
实验9 排序算法设计及分析 267
第10章 综合应用设计 269
10.1 JAVA集合框架 269
10.1.1 Comparator比较器接口 269
10.1.2 Arrays数组类 269
10.1.3 集合 270
10.1.4 映射 276
10.2 实现迭代器 277
10.2.1 提供迭代器的类 277
10.2.2 基于迭代器的操作 280
10.3 算法设计策略 281
10.3.1 分治法 282
10.3.2 动态规划法 283
10.3.3 贪心法 285
10.3.4 回溯法 295
10.4 课程设计的目的、要求和选题 309
附录A ASCII字符与Unicode值 316
附录B Java关键字 317
附录C Java基本数据类型 319
附录D Java运算符及其优先级 320
附录E Java类库(部分) 321
E.1 java.lang语言包 321
E.2 java.util实用包 324
附录F MyEclipse常用菜单命令 326
参考文献 328
展开
第4版前言
本书是“十二五”普通高等教育本科国家级规划教材,可作为普通高等学校计算机及相近专业本科的“数据结构”课程的教材。
数据结构是软件设计的重要理论和实践基础,数据结构设计和算法设计是软件系统设计的基础和核心。“数据结构”课程讨论的知识内容是软件设计的理论基础,介绍的技术方法是软件设计中使用的基本方法。“数据结构”是理论与实践并重的课程,既要掌握数据结构的基础理论知识,又要掌握运行和调试程序的基本技能。因此,“数据结构”课程在计算机学科本科培养体系中具有非常重要的地位,是计算机类各专业的核心课程,是培养程序设计能力必不可少的重要环节。
“数据结构”课程内容多,概念抽象,理论深奥,递归算法难度大,是计算机专业最难学的课程之一。根据计算机专业本科的培养目标,本书内容覆盖了数据结构课程的基础理论和典型算法,重点突出数据结构设计和算法设计,通过降低理论难度和抽象性,加强实践环节等措施,增强学生的理解能力和应用能力。配套教学资源齐全。
本书特色说明如下。
(1)内容全面、理论基础厚实
本书全面系统地介绍数据结构的基础理论和算法设计方法,阐明线性表、树、图等数据模型的逻辑结构,讨论它们在计算机中的存储结构,讨论每种数据结构所能进行的多种操作,以及这些操作的算法设计和实现;针对软件设计中应用频繁的查找和排序问题,根据不同数据结构对操作的实际需求,给出多种查找和排序算法,并分析算法的执行效率。
本书内容选择适合工科院校,理论叙述精练、简明扼要,结构安排合理、由浅入深、层次分明、重点突出,算法分析透彻,程序结构严谨规范,内容涉及的广度和深度符合计算机专业本科培养目标。
(2)采用Java语言描述数据结构和算法
描述数据结构和算法所采用的程序设计思想和方法,以及实现它们所采用的程序设计语言,都必须随着软件时代的发展而发展。面向对象程序设计方法是目前软件开发的主流方法;Java语言是目前功能最强、应用最广泛的一种完全面向对象程序设计语言,具有成熟而严密的语法体系和强大的应用系统设计能力,其特有的面向对象、跨平台特性、内存自动管理、异常处理、多线程等机制,使其更健壮、更安全、更高效。今日Java应用无处不在,其重要性无庸置疑。
Java语言放弃了C++语言的全局函数、结构、指针、友元类、运算符重载、多重继承等,这些丝毫没有影响Java功能,而Java提供的机制具有更强的功能和更高的性能。Java提倡简单性原则,对一个问题只提供一种简单精炼的表达方法,这样使程序简单、直接并且不造成歧义,它所提供的各种机制均体现出简单性原则。例如,使用下标形式对数组元素进行操作,则不需要使用指针;方法(函数)采用返回值或引用类型参数返回结果,也不需要使用指针;有了类,则不需要结构类型;构造方法采用重载方式,则不需要采用参数默认值形式,避免产生歧义;通过成员方法实现类的操作,则不需要运算符重载;通过“单重继承+接口”方式实现多重继承,通过内存自动管理机制自动释放动态分配的存储空间等。
Java语言提供类的封装、继承、多态和抽象特性,提供数组和对象引用模型,提供具有类模板功能的泛型,以及函数能够实现递归等等,这些不仅具备表达数据结构和算法的基本要素,而且能使算法更简明、更直接,性能更好。因此,本书采用Java语言描述数据结构和实现算法不仅可行,作为面向对象的程序设计方法训练也是十分恰当的,更是数据结构课程教学改革的必然发展趋势,完全符合本科培养目标的要求。依托一种功能强大的程序设计语言,充分表达和实现复杂的算法设计,体现软件模块化、可重用的设计思想,是提高程序设计能力的有效手段。
本书充分展示了使用Java语言的优越性。
① 在设计线性表、二叉树、树、图等数据结构时,以泛型类为设计基础,将封装、继承、多态、抽象等面向对象技术贯穿始终,采用面向对象思想刻画和表达数据结构设计,这是这个时代的软件设计所必需的。
② 以Java的集合框架为背景,采用多种数据结构实现了多种不同特性的集合类,以及各种迭代器。并将Java集合运用于实际工程应用。
(3)加强实际应用和实践环节
理论与实践相结合是提高软件设计能力的有效途径。数据结构是一门理论和实践紧密结合的课程,要在透彻理解理论知识的基础上,通过实践性环节,逐步锻炼程序设计能力。
本书不仅注重传授基础理论知识,更注重在实践环节中培养程序设计的基本技能。将程序设计能力的锻炼和提高设计为一个循序渐进的过程,从原理叙述、例题、思考题等课堂讲授环节,到课后习题、上机实验、课程设计等实践性环节,精心安排“先见识、再模仿、最后自主创新设计”的学习过程。精选并设计一系列例题、习题、实验题、课程设计题等,选题之间前后衔接,逐步深入,层层推进,既突出Java语言的特点,又与现实生活息息相关,使原本枯涩难懂的理论变得生动,充分说明数据结构和算法必要性,以及对实际应用程序设计的指导作用;同时,还引导学生在生活中发现问题并解决问题,提高学习兴趣,力求在潜移默化中使学生理解和体会理论知识的重要性,并掌握如何使用它们的方法。
每章的实验题均给出详细的训练目标、设计内容和设计要求,针对课程设计实践性环节,给出多种算法设计与分析的综合应用程序设计实例,详细说明需求方案、设计思想、模块划分、功能实现、调试运行等环节的设计方法,贯彻理论讲授和案例教学相结合的教学方法。
程序设计有其自身的规律,不是一蹴而就的,也没有捷径。程序员必须具备基本素质,必须掌握程序设计语言的基本语法以及算法设计思想和方法,并且需要积累许多经验。这个逐步积累的过程需要一段时间,需要耐心,厚积而薄发。
本书第1~9章是“数据结构”课程的主要内容,包括线性表、树、图等数据结构设计以及查找和排序算法设计;第10章综合应用设计,包括课程设计的范例和参考选题。
本书所有程序已在MyEclipse 2014(JDK 8u25)集成开发环境中调试通过。熟练掌握集成开发环境的各种操作以及程序调试技术是程序设计的一项基本技能,也需要经过一个逐步积累的过程。使用JDK和MyEclipse集成开发环境的详细说明见《Java程序设计实用教程(第4版)》(ISBN 978-7-121-21733-3,叶核亚编著,“十二五”普通高等教育本科国家级规划教材)。
本书由叶核亚编著,在写作过程中得到了许多帮助和支持。感谢南京大学计算机科学与技术系陈本林教授,陈老师认真细致地审阅了全稿,提出了许多宝贵意见;感谢黄纬、徐金宝、彭焕峰、廖雷、阚建飞、陈立等老师给予的帮助,感谢电子工业出版社的支持,感谢众多读者朋友对本书前3版提出的宝贵意见。
对书中存在的不妥与错漏之处,敬请读者朋友批评指正。
本书为任课教师提供配套的教学资源(包含电子教案和例题源代码),需要者可登录华信教育资源网(http://www.hxedu.com.cn),注册之后进行下载。
读者反馈:unicode@phei.com.cn,或yeheya@x263.net。
作 者
展开