猜你喜欢
数据结构与算法详解

数据结构与算法详解

书籍作者:陈锐 ISBN:9787115546661
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:1441
创建日期:2021-10-07 发布日期:2021-10-07
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介
本书旨在讲解数据结构和算法的核心知识。本书主要内容包括线性表、栈、队列、串、数组、广义表、树、图、查找算法、排序算法、递推算法、递归算法、枚举算法、贪心算法、回溯算法、数值算法和实用算法等。本书适合计算机专业的学生、软件开发专业人员等阅读。
作者简介
陈锐,软件设计师,计算机教师,出版过《零基础学数据结构》《C/C++函数与算法速查大辞典》《C/C++数据结构与算法大辞典》《C语言从入门到精通》。熟悉数据结构与算法等领域,从事数据结构与算法方面的教学等工作。
编辑推荐
1.结构合理:内容和实例先易后难,循序渐进;
2.涵盖学习经验总结:在讲解知识点、分析实例及调试程序时,加入了作者在学习过程中的经验总结,指出了初学者常犯的错误,让读者少走弯路;
3.代码均通过调试:所有代码在Visual C++ 6.0中调试过。代码也可以在Visual Studio 2003以上版本中直接运行,在代码最后加上system("pause")使程序暂停,以便查看运行结果;
4.实例丰富:剖析了高等院校的部分考研题目。


本书不仅介绍了数据结构和算法设计方面的理论知识,还结合具体案例讲述了算法的设计思路和实现过程。通过本书,读者不仅可以深入理解线性表、栈、队列、串、数组、广义表、树、图等数据结构,还可以掌握查找算法、排序算法、递推算法、递归算法、枚举算法、贪心算法、回溯算法、数值算法和实用算法等的实现方式。本书适合计算机专业的师生和软件开发人员阅读。

本书特色:
? 内容由浅入深,通俗易懂;
? 不仅讲述基础知识,还展示了大量代码;
? 涵盖主要数据结构与常用算法;
? 案例丰富,剖析了高等院校的部分考研题目。
目录
目 录


第 一部分 数据结构

第0章 基础知识 2
0.1 基本概念和术语 2
0.2 数据的逻辑结构与存储结构 3
0.2.1 逻辑结构 3
0.2.2 存储结构 4
0.3 抽象数据类型及其描述 5
0.3.1 什么是抽象数据类型 5
0.3.2 抽象数据类型的描述 5
0.4 算法 5
0.4.1 数据结构与算法的关系 6
0.4.2 什么是算法 6
0.4.3 算法的五大特性 6
0.4.4 算法的描述 6
0.5 算法分析 7
0.5.1 算法设计的4个目标 7
0.5.2 算法的时间复杂度 7
0.5.3 算法的空间复杂度 9
第 1章 线性表 10
1.1 顺序表及其应用 10
1.1.1 将两个有序的线性表合并
为一个有序的线性表 13
1.1.2 将两个无序的线性表合并
为一个线性表 16
1.1.3 求两个线性表的差集 18
1.1.4 分解顺序表,使左边的
元素小于或等于0,右边的
大于0 19
1.1.5 求两个任意长度的整数
之和 21
1.1.6 求两个元素序列的
中位数 23
1.2 单链表及其应用 25
1.2.1 逆置单链表 30
1.2.2 求两个单链表的差集 34
1.2.3 合并两个单链表 37
1.2.4 找出单链表表示的两个单词
共同后缀起始地址 40
1.2.5 找出单链表中倒数第k个
位置上的节点 42
1.3 循环单链表及其应用 44
1.3.1 分解一个循环单链表为
两个循环单链表 44
1.3.2 构造3个循环单链表 47
1.3.3 约瑟夫问题 50
1.4 双向链表及其应用 53
1.4.1 双向链表的创建与插入
操作 55
1.4.2 约瑟夫问题(双向链表) 58
1.5 线性表的典型应用 60
1.5.1 将两个一元多项式相加 60
1.5.2 将两个一元多项式相乘 65
第 2章 栈 71
2.1 顺序栈及其应用 71
2.1.1 将元素分别入栈和出栈 73
2.1.2 共享栈的入栈和出栈操作 75
2.1.3 求C (n,m)的值 78
2.1.4 求Ackermann(m,n)的值 80
2.2 链栈及其应用 83
2.2.1 将十进制数转换为
八进制数 86
2.2.2 检查表达式中的括号
是否匹配 88
2.2.3 求算术表达式的值 90
2.2.4 判断字符串是否中心
对称 96
第3章 队列 98
3.1 顺序队列及其应用 98
3.1.1 将顺序循环队列中的元素
分别入队和出队 101
3.1.2 舞伴配对 104
3.1.3 模拟轮渡管理 106
3.2 链式队列及其应用 108
3.2.1 队列在杨辉三角中的
应用 111
3.2.2 判断字符串是否为回文 114
3.3 栈和队列的综合应用──停车场
管理 116
第4章 串 126
4.1 顺序串及其应用 126
4.1.1 利用串的基本运算进行
赋值、插入和删除等操作 130
4.1.2 将浮点数转换为对应的串 134
4.1.3 求最长公共子串 135
4.1.4 求等值子串 137
4.1.5 将长度为5的单词转换为
大写形式 138
4.1.6 将小写字母a左、右两边的
串互换 140
4.2 串的模式匹配 142
第5章 数组 149
5.1 一维数组及其应用 149
5.1.1 查找第k小元素 150
5.1.2 将奇数移动到偶数的
左边 151
5.2 二维数组(矩阵)及其应用 153
5.2.1 输出魔方阵 153
5.2.2 输出内螺旋矩阵 155
5.2.3 输出逆螺旋矩阵 156
5.2.4 输出外螺旋矩阵 158
5.2.5 输出蛇形方阵 159
5.2.6 输出折叠方阵 161
5.3 特殊矩阵的压缩存储及其应用 162
5.4 稀疏矩阵的压缩存储及其应用 166
第6章 广义表 172
6.1 头尾链表表示的广义表及其
应用 172
6.2 扩展线性链表表示的广义表
及其应用 178
6.3 广义表的综合应用——导师-学生
制管理 181
第7章 树 187
7.1 树的表示及创建二叉树 187
7.1.1 采用广义表创建二叉树 194
7.1.2 创建二叉树 196
7.2 二叉树的遍历 199
7.2.1 非递归先序遍历二叉树 205
7.2.2 按层次遍历二叉树 207
7.2.3 由中序和后序序列构造
二叉树 209
7.2.4 输出树的各条边 212
7.3 二叉树的应用 214
7.3.1 求树中节点的个数 214
7.3.2 交换二叉树的左右子树 216
7.3.3 判断二叉树是否为完全
二叉树 219
7.3.4 计算二叉树的高度和最大
宽度 223
7.3.5 求树中根节点到任意节点
之间的路径 226
7.4 哈夫曼树 230
第8章 图 235
8.1 图的表示及应用 235
8.1.1 利用邻接矩阵创建
有向网 238
8.1.2 利用邻接表创建有向图 241
8.1.3 把图的邻接矩阵表示
转换为邻接表表示 244
8.2 图的遍历 248
8.2.1 判断有向图中是否存在
回路 249
8.2.2 深度优先搜索遍历
无向图 251
8.2.3 图的广度优先搜索遍历 254
8.2.4 判断有向图中是否有根
顶点 258
8.2.5 求距离顶点v0的最短路径
长度为k的所有顶点 261
8.2.6 判断顶点u和顶点v之间
是否存在简单路径 265
8.2.7 判断无向图是否为一棵树 269

第二部分 算 法

第9章 查找算法 274
9.1 与查找算法相关的概念 274
9.2 基于线性表的查找 275
9.2.1 顺序查找 275
9.2.2 折半查找 276
9.2.3 分块查找 279
9.3 基于树的查找 281
9.4 哈希表的查找 285
第 10章 排序算法 290
10.1 排序的基本概念 290
10.2 插入排序 291
10.2.1 直接插入排序 291
10.2.2 折半插入排序 293
10.2.3 希尔排序 296
10.3 交换排序 298
10.3.1 冒泡排序 298
10.3.2 快速排序 302
10.4 选择排序 305
10.4.1 简单选择排序 305
10.4.2 堆排序 308
10.5 归并排序 313
10.6 基数排序 316
第 11章 递推算法 324
11.1 顺推法 324
11.1.1 斐波那契数列 324
11.1.2 角谷猜想 327
11.1.3 将十进制整数转换为
二进制整数 328
11.1.4 将十进制浮点数转换为
二进制数 329
11.1.5 母牛生小牛问题 330
11.1.6 输出杨辉三角 332
11.1.7 质因数分解 333
11.1.8 求最大公约数和最小公
倍数 333
11.2 逆推法 334
11.2.1 猴子摘桃 334
11.2.2 存钱问题 335
第 12章 递归算法 337
12.1 简单递归 337
12.1.1 求n的阶乘 337
12.1.2 斐波那契数列 340
12.1.3 求n个元素中的最大者 341
12.1.4 求n个数的和 342
12.1.5 将十进制整数转换为
二进制整数 343
12.1.6 求整数的逆序数 344
12.1.7 求最大公约数 345
12.1.8 求Ackermann函数的值 346
12.1.9 求C (n,m)的值 347
12.2 复杂递归 348
12.2.1 逆置字符串 348
12.2.2 求最大和次大元素 349
12.2.3 求无序序列中第k大的
元素 351
12.2.4 和式分解 352
12.2.5 台阶问题 354
12.2.6 汉诺塔问题 356
12.2.7 大牛生小牛问题 358
12.2.8 从自然数1~n中任选r
个数的所有组合数 359
第 13章 枚举算法 361
13.1 判断n是否能被3、5、7整除 361
13.2 百钱买百鸡 363
13.3 五猴分桃 364
13.4 输出“水仙花数” 366
13.5 Mary的借书方案 367
13.6 整币换零 368
13.7 填数游戏 369
13.8 谁在说谎 371
13.9 求最大连续子序列和 372
13.10 0/1背包问题 373
第 14章 贪心算法 376
14.1 贪心算法的基础 376
14.1.1 贪心算法的基本思想 376
14.1.2 贪心选择性质 376
14.1.3 贪心算法的求解步骤 376
14.2 找零钱问题 377
14.3 会议安排问题 378
14.4 最优装载问题 381
14.5 哈夫曼编码 383
14.6 加油点问题 387
14.7 背包问题 389
第 15章 回溯算法 392
15.1 回溯算法的基础 392
15.1.1 回溯算法的解空间 392
15.1.2 回溯算法的搜索 393
15.2 求自然数1~n中r个数的所有
组合 394
15.3 填字游戏 395
15.4 和式分解(非递归实现) 399
15.5 装箱问题 401
15.6 0/1背包问题 404
第 16章 数值算法 408
16.1 求实数的平方根 408
16.2 利用二分法求方程的根 409
16.3 利用牛顿迭代法求方程的根 411
16.4 利用高斯消元法求解线性方程组 413
16.5 利用梯形法求定积分 416
16.6 计算π的近似值 418
第 17章 实用算法 421
17.1 阿拉伯数字/中文大写金额的
转换 421
17.2 将15位身份证号转换为18位 424
17.3 计算7的34次方 426
17.4 计算某年某月某日是一年中的
第几天 427
17.5 大整数相乘 428
17.6 输出万年历 430
17.7 求两个正整数的差 434
17.8 利用二叉树结构计算算术
表达式的值 436
第 18章 常见错误与程序调试技术 439
18.1 常见错误 439
18.1.1 错误分类 439
18.1.2 常见错误举例 440
18.2 程序调试 444
18.2.1 Visual C++ 6.0开发
环境中程序的调试 444
18.2.2 程序调试应用举例 451
18.3 小结 462