本书紧紧围绕《高等学校计算机专业核心课程教学实施方案》,并参照安徽省高等学校计算机教育研究会课程建设专业委员会提出的地方应用型本科“数据结构”课程教学大纲编写而成。全书共分为8章,第1章为绪论,主要介绍数据结构和算法的基本概念。第2~4章介绍线性数据结构的类型、特点及其操作算法等,其中,第2章具体介绍普通的线性表,第3章具体介绍栈与队列这样“操作受限”的线性表,第4章则具体介绍一些特殊的线性表(串)与推广的线性表(数组、广义表)。第5、6章介绍树与图,主要介绍具有非线性数据结构的树、图等较为复杂的数据结构特征及操作算法。第7、8章介绍查找与排序,主要介绍各种常见的查找与排序算法,以及优化存储结构的思想等。为了起到衔接课堂教学、方便实验教学的作用,本书附录给出了6个基础性的数据结构实验题,并配有完整的Python源代码,能够在PythonIDLE环境下顺利运行,供学生上机调试参考。本书难易适度,结构清晰,图文并茂,文字表达通俗易懂、实用性强。注重理论和实践的结合,强调Python程序算法设计素养与教育,可帮助读者进一步掌握数据结构的基本知识和技能,学会运用数据结构知识解决实际问题。本书适合作为地方应用型本科高校计算机及相关专业“数据结构”课程的教材、计算机类专业硕士研究生入学考试“数据结构”课程的考研辅导书,也可作为高职院校软件技术类专业学生的课外学习辅导教材。还可以作为参加计算机程序算法设计相关学科竞赛的培训教材,以及对数据结构与算法知识感兴趣的各类企业IT人员与计算机爱好者的参考书。
在内容的选取与结构安排上,本书选择了语法简洁、功能强大,有着广泛应用领域Python作为描述语言。通过分类和讲解典型结构使读者对数据结构形成宏观认识,强调算法设计素养与思政教育相结合,读者能够使用有效的方法处理各类数据,并在构建的数据结构上设计出高效的算法。本书提供配套电子课件,读者可登录清华大学出版社网站下载。每章配有大量选择题、简答题、算法设计题、应用题等,附录还配有完整的数据结构实验及相应的Python源代码,帮助读者巩固所学知识,提高Python程序算法设计与应用能力。本书同时在安徽智慧教育平台开设数据结构MOOC教学视频,可作为地方应用型本科计算机类专业学生开展数据结构课程“线上+线下”混合学习活动的辅助教材。
前言
“数据结构”是本科计算机及相关专业的一门核心课程,也是计算机学科中的一门理论性较强的专业基础课。当我们用计算机求解实际问题时,必然涉及数据组织及数据处理,这些正是本课程的主要学习内容。所以,数据结构不仅是一般程序设计的知识,而且是设计其他应用系统程序的重要基础。数据结构与问题求解能力也是评判本科计算机类专业学生是否具有良好专业素养的标准。计算机类专业学生在学习时,要学会灵活运用各类数据结构和算法知识去解决生活中的一些实际问题。因此,掌握扎实的数据结构基本知识,对于今后的专业学习、各类中小型Web程序设计,以及大型软件系统开发与维护等格外重要。对于初学者来说,许多专业术语较为抽象,不容易理解和掌握,本书采用通俗的语言以及案例和图表讲解,便于读者真正理解和掌握。
党的二十大报告提出,坚持教育优先发展,科技自立自强,人才引领驱动,加快建设教育强国,科技强国,人才强国。随着国内人工智能及其相关技术的快速发展,作为学习人工智能技术的语言基础,Python语言以语法简单易懂、开发速度快捷、擅长数据分析与处理、拥有强大的第三方工具库等优势,已被广泛地应用于诸多人工智能领域,已成为主流的计算机程序设计语言之一,受到越来越多的人青睐。国内各高校计算机类专业均开设了“Python程序设计”课程,因此,本书采用Python作为数据结构的描述语言,其相比于传统的C/C++、Java语言,更容易学习。通过学习本书的内容,读者既可以加深对数据结构基本概念的理解和认识,又能提高对各种数据结构进行运算分析与设计的能力,也为今后学习人工智能领域的相关知识打下坚实的语言基础。
本书共8章,面向地方应用型本科计算机类专业“数据结构”课程教学目标,系统地介绍了数据结构中的各类线性结构、树结构、图结构,以及查找、排序方法,并用通俗易懂的语言图文并茂地阐述了各种数据结构的逻辑关系,以及在计算机中的存储表示及其运算等,每章的学习目标中还都潜移默化地融入了元素。为了同步解决课程实验教学问题,附录部分详细给出了6个难度不大但具有代表性的数据结构实验。考虑到地方应用型本科计算机类专业学生的算法设计能力与编程水平有限,每个实验都给出了完整的Python源代码,能够在Python IDLE环境下顺利运行,可供学生上机调试参考。本书参考学时为52学时(其中包括12个实验学时),各章的参考学时如表1所示。当然,在实际教学过程中,任课教师可根据实际教学安排适度增减教学内容或适时调整实验内容。需要说明的是,由于现在很多高校纷纷在国内一些知名MOOC平台上开设自己的“数据结构”课程,数据结构各类MOOC/SPOC学习资源也较为丰富,因此本课程若能采用“线上+线下”相结合的混合学习模式,教学效果会更佳,更好地培养学生的自主学习能力。表1学习内容参考学时分配表
学 习 内 容参考学时理论内容
(40学时)第1章绪论2第2章线性表4第3章栈与队列6第4章串、数组与广义表4第5章树8第6章图8第7章查找4第8章排序4实验内容
(12学时)实验1顺序表的基本操作2实验2链表的基本操作2实验3利用顺序栈实现数制转换2实验4二叉树的建立及递归遍历2实验5二叉树的应用2实验6折半插入排序算法的实现2本书是编者多年从事地方应用型本科高校“数据结构”课程的教学实践与感悟。是在对备课教案进行认真而系统的梳理后精心编写而成,同时也凝聚了多位一线任课教师的教学心血与教研成果。本书以安徽高校省级质量工程项目“软件工程师培养计划”(编号: 2023zybj062)、“课程视域下基于OBE的地方应用型软件工程人才培养模式创新与实践”(编号: 2022jyxm494)、安徽省高校拔尖人才培育项目“应用型本科软件工程专业新工科建设研究”(编号: gxbjZD2022087),以及安徽省高校科研创新团队(编号: 2023AH010064)为依托,系项目研究成果之一。
本书由安徽三联学院余久久、安徽国际商务职业学院蔡政策、安徽声讯信息技术有限公司虞焰兴担任主编。安徽财贸职业学院凌勇、安徽粮食工程职业学院李昌群与唐珊、滁州学院陈杰、安徽国际商务职业学院王嫱担任副主编,共同完成编写。余久久负责完成全书内容的统稿工作。在成书过程中,也得到了安徽三联学院智慧交通现代产业学院凤鹏飞、张继山以及我校相关的大力支持。此外,安徽声讯信息技术有限公司葛阿平、徐勇也为该书部分内容的编写工作提出了很多宝贵的建议,在此表示衷心的感谢。
本着学习与借鉴的目的,本书在编写过程中参考了大量同类数据结构与算法方面的书籍及相关文献资料,以及百度、IT技术社区(论坛)、微信公众号、国内知名MOOC平台等推送的数据结构及算法应用方面的网络博文,在此谨向原作者表示诚挚的谢意。由于编者水平有限,加之时间仓促,书中的疏漏和不当之处仍在所难免,还望各位同行批评指正。
编者2024年7月
余久久,男,硕士研究生,教授。现任安徽三联学院计算机工程学院软件工程教研室主任,本科软件工程专业负责人,安庆师范大学硕士研究生导师。研究方向:现代软件工程,敏捷软件测试,现代教育技术,高校信息化资源建设等。
目录
第1章绪论1
1.1数据结构研究的内容1
1.1.1为什么要学习数据结构2
1.1.2数据结构中的例子4
1.1.3数据结构研究的内容8
1.2数据结构中的基本概念8
1.2.1基本概念与术语8
1.2.2数据结构9
1.3数据类型的表示与实现12
1.3.1数据类型12
1.3.2抽象数据类型13
1.4算法与算法分析15
1.4.1算法的定义及特性15
1.4.2算法的时间复杂度16
1.4.3算法的空间复杂度20
1.5Python语言简介21
1.5.1Python的标准数据类型21
1.5.2输入/输出和文件操作21
1.5.3面向对象编程22
小结24
习题25第2章线性表27
2.1线性表的基本概念27
2.1.1线性表的定义27
2.1.2线性表的抽象数据类型描述29
2.2线性表的顺序存储结构30
2.2.1线性表的顺序表示30
2.2.2顺序表的基本操作32
2.2.3顺序表的应用案例37
2.3线性表的链式表示和实现39
2.3.1链表的存储结构39
2.3.2单链表的基本操作41
2.3.3双向链表57
2.3.4循环链表64
2.4顺序表和链表的比较69
2.5线性表的应用——机场乘客排队值机系统70
小结71
习题72第3章栈与队列75
3.1栈75
3.1.1栈的基本概念75
3.1.2使用Python列表实现栈79
3.1.3栈的应用场景81
3.2队列83
3.2.1队列的基本概念84
3.2.2使用collections.deque实现队列85
3.2.3优先队列87
3.2.4队列的应用场景89
小结91
习题92第4章串、数组与广义表94
4.1串94
4.1.1串的基本概念94
4.1.2串的顺序存储及运算95
4.1.3串的链式存储及运算97
4.1.4串的模式匹配99
4.1.5串的应用案例101
4.2数组102
4.2.1数组的基本概念102
4.2.2数组的顺序存储103
4.2.3特殊矩阵的压缩存储105
4.2.4数组的应用案例106
4.3广义表108
4.3.1广义表的基本概念108
4.3.2广义表的存储结构108
4.3.3广义表的操作109
小结111
习题112第5章树114
5.1树和二叉树114
5.1.1树的定义与基本术语115
5.1.2二叉树的定义与特点115
5.1.3树与二叉树的示例描述116
5.2二叉树案例引入116
5.3二叉树的性质和存储结构118
5.3.1二叉树的性质118
5.3.2二叉树的存储结构119
5.4遍历二叉树和线索二叉树121
5.4.1遍历二叉树121
5.4.2线索二叉树130
5.5树和森林132
5.5.1树的表示方法132
5.5.2森林和二叉树的转换134
5.5.3哈夫曼树136
5.6案例分析与实现138
小结141
习题141第6章图144
6.1图的基本概念144
6.1.1图的定义144
6.1.2图的基本术语144
6.2图的存储结构146
6.2.1邻接矩阵146
6.2.2邻接表147
6.3图的遍历149
6.3.1深度优先遍历149
6.3.2广度优先遍历150
6.4图的最小生成树152
6.4.1基本概念152
6.4.2Prim算法152
6.4.3Kruskal算法154
6.5最短路径156
6.5.1基本概念156
6.5.2应用实例157
6.6拓扑排序159
6.6.1基本概念159
6.6.2拓扑排序的实现160
6.7关键路径162
6.7.1基本概念162
6.7.2关键路径的算法164
小结165
习题165第7章查找168
7.1查找的基本概念168
7.2线性表的查找169
7.2.1顺序查找169
7.2.2折半查找170
7.2.3分块查找172
7.3二叉树的查找174
7.3.1二叉排序树174
7.3.2平衡二叉树183
7.4哈希表的查找185
7.4.1哈希表186
7.4.2哈希函数的构造方法187
7.4.3冲突处理的方法188
7.4.4哈希表查找的算法分析190
小结191
习题191第8章排序194
8.1认识排序194
8.1.1排序的基本概念194
8.1.2排序算法的评价指标195
8.2插入排序195
8.2.1直接插入排序196
8.2.2二分法插入排序197
8.2.3希尔排序199
8.3交换排序200
8.3.1冒泡排序200
8.3.2快速排序202
8.4选择排序203
8.4.1简单选择排序203
8.4.2堆排序204
8.5归并排序207
8.6基数排序208
小结210
习题212附录A实验215
实验1顺序表的基本操作215
实验2链表的基本操作217
实验3利用顺序栈实现数制转换220
实验4二叉树的建立及递归遍历221
实验5二叉树的应用224
实验6折半插入排序算法的实现226参考文献230