算法与数据结构(第三版)

算法与数据结构 990 浏览 126 下载

算法与数据结构(第三版)
332页 免费
作者: 陈媛,卢玲,何波,刘恒洋
出版社: 清华大学出版社
页数: 332页
ISBN: 9787302539667
下载信息

下载类型: 直接下载

销售价格: ¥0.00


书籍详情
用纸 胶版纸
版次 3
出版时间 2020-01-01
字数 503000
页数 332
包装 平装
开本 16
ISBN 9787302539667
正文语种 中文
出版社 清华大学出版社
丛书名 21世纪高等学校规划教材·计算机科学与技术
品牌 清华大学出版社(TSINGHUA UNIVERSITY PRESS)
商品编号 12803214
包装清单 暂无
内容简介
编辑推荐 算法与数据结构(第三版)是2011年出版的第二版的修订版。第三版在保持原书基本框架和特色的基础上,增加了常用算法设计技术。全书系统介绍了算法与数据结构方面的基本知识,重点阐述了基本数据结构及算法在程序开发中的应用方法,能够帮助读者极大地提高软件开发和设计能力。 内容简介   《算法与数据结构(第三版)》系统介绍了算法与数据结构方面的基本知识,重点阐述了基本数据结构及算法在程序开发中的应用方法。通过深入地学习和分析,能够帮助读者极大地提高软件开发和设计能力。 作者简介 主编先后主讲数据结构、算法设计与分析、程序设计基础、计算机组成原理等课程,同时悉心指导课程设计和毕业设计,积极指导学生课外科技活动。在教学中形成了独特的教学风格,教学经验丰富,受到师生好评,在教学质量排名中一直位居前20%;作为重庆理工大学精品课程《数据结构》负责人,对课程建设作了大量工作。 主编始终站在教学、科研一线,积极参加教育教学改革和科学研究,主编出版《算法与数据结构》等教材4部,参编4部;在国内外学术期刊和国际会议上公开发表论文40余篇,其中被EI、ISTP检索7篇;主持并完成“光通讯网络互连技术研究”等省部级科研项目4项,参与20余项;主持并完成“地方高校程序设计系列课程改革研究与实践”、“地方高校专业学位研究生算法设计案例库的建设研究”等教研项目4项;获重庆市自然科学三等奖1项、重庆市教学成果三...
详细介绍
编辑推荐
  算法与数据结构(第三版)是2011年出版的第二版的修订版。第三版在保持原书基本框架和特色的基础上,增加了常用算法设计技术。全书系统介绍了算法与数据结构方面的基本知识,重点阐述了基本数据结构及算法在程序开发中的应用方法,能够帮助读者极大地提高软件开发和设计能力。
内容简介

  《算法与数据结构(第三版)》系统介绍了算法与数据结构方面的基本知识,重点阐述了基本数据结构及算法在程序开发中的应用方法。通过深入地学习和分析,能够帮助读者极大地提高软件开发和设计能力。

作者简介
  主编先后主讲数据结构、算法设计与分析、程序设计基础、计算机组成原理等课程,同时悉心指导课程设计和毕业设计,积极指导学生课外科技活动。在教学中形成了独特的教学风格,教学经验丰富,受到师生好评,在教学质量排名中一直位居前20%;作为重庆理工大学精品课程《数据结构》负责人,对课程建设作了大量工作。
   主编始终站在教学、科研一线,积极参加教育教学改革和科学研究,主编出版《算法与数据结构》等教材4部,参编4部;在国内外学术期刊和国际会议上公开发表论文40余篇,其中被EI、ISTP检索7篇;主持并完成“光通讯网络互连技术研究”等省部级科研项目4项,参与20余项;主持并完成“地方高校程序设计系列课程改革研究与实践”、“地方高校专业学位研究生算法设计案例库的建设研究”等教研项目4项;获重庆市自然科学三等奖1项、重庆市教学成果三等奖1项、校优秀教学成果2项;多次获得校“教学工作优秀教师”等奖项。
目录

第1章 绪论
1.1 数据结构的基本概念与学习方法
1.1.1 数据结构的研究对象
1.1.2 数据结构的基本概念和基本术语
1.2 算法与数据结构
1.2.1 算法的概念
1.2.2 描述算法的方法
1.2.3 算法分析
1.3 学习算法与数据结构的意义和方法
1.4 C语言的数据类型及其算法描述
1.4.1 C语言的基本数据类型概述
1.4.2 C语言的数组和结构体数据类型
1.4.3 C语言的指针类型概述
1.4.4 C语言的函数
1.4.5 用C语言验证算法的方法
1.5 从C语言到C++语言
1.5.1 C++语言的类和抽象数据类型
1.5.2 C++语言验证算法的方法
1.5.3 C++语言与C语言程序的区别
1.5.4 C++语言的重要特性
习题1
上机练习1

第2章 线性表
2.1 线性表的逻辑结构
2.1.1 线性表的定义
2.1.2 线性表的运算
2.2 线性表的顺序存储结构——顺序表
2.2.1 顺序表
2.2.2 顺序存储结构的优缺点
2.2.3 顺序表上的基本运算
2.3 线性表的链式存储结构——链表
2.3.1 单链表
2.3.2 循环链表和双向链表
2.4 线性表的应用示例
2.5 C++中的线性表
2.5.1 C++中线性表抽象数据类型
2.5.2 C++中线性表的顺序存储
2.5.3 C++中线性表的链式存储
习题2
上机练习2

第3章 栈和队列
3.1 栈
3.1.1 栈的基本概念
3.1.2 栈的顺序存储结构
3.1.3 栈的链式存储结构
3.2 栈的应用实例
3.2.1 表达式求值
3.2.2 栈与函数调用
3.2.3 栈在回溯法中的应用
3.3 队列
3.3.1 队列的基本概念
3.3.2 队列的顺序存储结构
3.3.3 队列的链式存储结构
3.4 队列的应用实例
3.4.1 舞伴问题
3.4.2 打印队列的模拟管理
3.5 递归
3.5.1 递归的定义及递归模型
3.5.2 递归的实现
3.5.3 递归设计
3.5.4 递归到非递归的转换
3.6 C++中的栈和队列
3.6.1 C++中的栈
3.6.2 C++中的队列
习题3
上机练习3

第4章 数组和字符串
4.1 数组
4.1.1 数组的定义与操作
4.1.2 数组的顺序存储结构
4.1.3 矩阵的压缩存储方法
4.2 字符串
4.2.1 字符串的定义与操作
4.2.2 字符串的存储结构
4.2.3 字符串基本操作的实现
4.2.4 字符串的应用举例
4.3 C++中的数组和字符串
4.3.1 C++中的数组
4.3.2 C++中的字符串
习题4
上机练习4

第5章 树
5.1 树的概念与操作
5.1.1 树的概念
5.1.2 树的基本操作
5.2 二叉树
5.2.1 二叉树的概念
5.2.2 二叉树的性质
5.2.3 二叉树的存储结构及其实现
5.3 二叉树的遍历
5.3.1 递归的遍历算法
5.3.2 二叉树遍历操作应用举例
5.4 线索二叉树
5.4.1 线索二叉树的定义
5.4.2 线索二叉树的常用运算
5.5 一般树的表示和遍历
5.5.1 一般树的表示
5.5.2 二叉树与树、森林之间的转换
5.5.3 一般树的遍历
5.6 哈夫曼树及其应用
5.6.1 哈夫曼树
5.6.2 哈夫曼树的应用
5.7 C++中的树
5.7.1 C++中的二叉树结点类
5.7.2 C++中的二叉树类
5.7.3 C++中二叉树的非递归遍历
习题5
上机练习5

第6章 图
6.1 图的概念与操作
6.1.1 图的定义
6.1.2 图的基本术语
6.2 图的存储结构
6.2.1 邻接矩阵
6.2.2 邻接表
6.2.3 十字链表
6.2.4 边集数组
6.3 图的遍历
6.3.1 深度优先搜索
6.3.2 广度优先搜索
6.4 图的连通性
6.4.1 无向图的连通分量
6.4.2 生成树和最小代价生成树
6.5 有向无环图及应用
6.5.1 拓扑排序
6.5.2 关键路径
6.6 最短路径及应用
6.6.1 单源最短路径
6.6.2 每对顶点之间的最短路径
6.7 C++中的图
6.7.1 C++中的图类
6.7.2 图的邻接表的C++程序
6.7.3 图的遍历的C++程序
6.7.4 图的最小生成树的C++程序
习题6
上机练习6

第7章 查找
7.1 基本概念与术语
7.2 静态查找表
7.2.1 静态查找表结构
7.2.2 顺序查找
7.2.3 有序表的折半查找
7.2.4 有序表的插值查找和斐波那契查找
7.2.5 分块查找
7.3 动态查找表
7.3.1 二叉排序树
7.3.2 平衡二叉树
7.3.3 B树和B+树
7.4 哈希表查找
7.4.1 哈希表与哈希方法
7.4.2 常用的哈希方法
7.4.3 处理冲突的方法
7.4.4 哈希表的查找分析
7.5 C++中的查找
7.5.1 静态查找的C++程序
7.5.2 动态查找的C++程序
习题7
上机练习7

第8章 排序
8.1 基本概念
8.2 插入排序
8.2.1 直接插入排序
8.2.2 希尔排序
8.3 交换排序
8.3.1 冒泡排序
8.3.2 快速排序
8.4 选择排序
8.4.1 简单选择排序
8.4.2 堆排序
8.5 归并排序
*8.6 基数排序
*8.7 外部排序简介
8.7.1 外存信息的存取
8.7.2 外部排序的基本方法
8.8 C++中的排序
习题8
上机练习8

第9章 常用算法设计技术
9.1 蛮力算法
9.1.1 蛮力算法思想
9.1.2 蛮力算法应用实例——最近对问题
9.2 分治算法
9.2.1 分治算法思想
9.2.2 分治算法设计
9.2.3 分治算法设计应用实例——棋盘覆盖问题
9.3 动态规划算法
9.3.1 动态规划算法思想及设计
9.3.2 动态规划算法应用实例——0/1背包问题
9.4 贪心算法
9.4.1 贪心算法技术思想
9.4.2 贪心算法设计
9.4.3 贪心算法应用实例——背包问题
9.5 回溯算法
9.5.1 回溯算法有关概念
9.5.2 回溯算法思想
9.5.3 回溯算法设计
9.5.4 回溯算法应用实例——装载问题
9.6 分支限界算法
9.6.1 分支限界算法思想
9.6.2 分支限界算法设计
9.6.3 分支限界算法应用实例——任务分配问题
习题9
上机练习9

第10章 标准模板库
10.1 STL简介
10.1.1 容器
10.1.2 迭代器
10.1.3 算法
10.2 STL应用实例
10.2.1 双向链表操作的STL实现
10.2.2 STL测试程序
习题10
上机练习10
参考文献

精彩书摘
第3章栈和队列
本章学习要点
(1) 掌握栈和队列这两种数据结构的特点,了解在什么问题中应该使用哪种结构。
(2) 熟悉栈(队列)和线性表的关系、顺序栈(顺序队列)和顺序表的关系、链栈(链队列)和链表的关系。
(3) 重点掌握在顺序栈和链栈上实现的栈的7种基本运算,特别注意栈满和栈空的条件及它们的描述。
(4) 重点掌握在循环队列和链队列上实现的7种基本运算,应特别注意队满和队空的描述方法。
(5) 熟悉栈和队列的下溢和上溢的概念; 顺序队列中产生假上溢的原因; 循环队列消除假上溢的方法。
(6) 了解递归算法执行过程中工作记录的变化情况。
栈和队列与线性表有着密切的联系,一方面,栈和队列的逻辑结构也是线性结构; 另一方面,栈和队列的基本操作是线性表操作的子集,因此,可将栈和队列看成两种特殊的线性表。


3.1栈

3.1.1栈的基本概念
日常生活中有不少类似于栈(如图3.1(a)所示)的例子。假设有一个很窄的死胡同,其宽度只能容纳一辆车,现有5辆车,分别编号为①~⑤,按编号顺序依次进入此胡同,若要退出④,必须先退出⑤; 若要退出①必须将⑤、④、③、②依次都退出才行。这个死胡同就是一个栈,如图3.1(b)所示。


图3.1栈及其示例


栈(stack)是允许仅在表的一端进行插入和删除操作的线性表。允许进行插入和删除的一端称为栈顶(top),不允许插入和删除的一端称为栈底(bottom)。不含元素的空表称为空栈。

假设栈S=(a1,a2,…,an),如图3.1(a)所示,a1为栈底元素,an为栈顶元素。栈中元素按a1,a2,…,an的次序进栈,退栈的第一个元素应为栈顶元素。也就是说,栈的特点是后进先出(last in first out,LIFO),因此,栈又称为后进先出的线性表,简称LIFO线性表。
在已知栈的逻辑结构和确定常用运算后,就可以定义栈的抽象数据类型。
ADT3.1是栈的抽象数据类型描述,其中包含最常见的栈运算。
ADT3.1栈ADT
ADT stack{
数据对象:

D={ai|ai∈元素集合,i=1,2,…,n,n≥0}
数据关系:
R1={〈ai-1,ai〉|ai-1,ai∈D,i=2,…,n},约定an端为栈顶,a1为栈底。

基本操作:
InitStack(): 创建一个空栈。
Destroy(): 撤销一个栈。
StackEmpty(): 若栈空,则返回1,否则返回0。
StackFull(): 若栈满,则返回1,否则返回0。
Top(x): 在x中返回栈顶元素。若操作成功,则返回1,否则返回0。
Push(): 在栈顶插入元素x(入栈)。若操作成功,则返回1,否则返回0。
Pop(): 从栈中删除栈顶元素(出栈)。若操作成功,则返回1,否则返回0。
Clear(): 清除栈中全部元素。
}ADT stack







图3.2十进制数35转换成
二进制数的过程



栈的应用非常广泛,例如进位记数制之间的转换问题。在将十进制数转换成二进制数时,常采用除法。用初始十进制数除以2,把余数记录下来,若商不为0,则再用商去除以2,直到商为0,这时把所有的余数按出现的逆序排列起来(先出现的余数排在后面,后出现的余数排在前面)就得到了相应的二进制数。例如把十进制数35转换成二进制数的过程如图3.2所示。

根据上述操作的描述,可以采用一个栈来保存所有的余数,当商为0时让栈中的所有余数出栈,这样就得到了正确的二进制数。
算法3.1十进制数转换成二进制数算法。

void conversion()

{

Stack S;

int n;

InitStack(&S);

printf("Input a number to convert:\n");

scanf("%d",&n);

if(n<0)

{

printf("\nThe number must be over 0.");

return 0;

}

if(n==0) Push(&S,0);

while(n!=0)

{

Push(&S,n%2);

n=n/2;

}

printf("the result is: ");

while(!StackEmpty(&S))

{

printf("%d", Pop(&S));

}

}


前言/序言
 
前言


1. 关于算法与数据结构
随着计算机技术的日益发展,其应用早已不再局限于简单的数值运算,而涉及问题的分析、数据结构框架的设计以及插入、删除、排序、查找等复杂的非数值处理和操作。学习算法与数据结构就是为以后利用计算机高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。
算法与数据结构旨在分析、研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。
随着计算机技术的发展,特别是大数据及人工智能技术的发展与应用,算法的重要性有目共睹。《算法与数据结构(第三版)》是对2011年出版的第二版的修订。本版教材在保持原书基本框架和特色的基础上,增加了蛮力算法、分治算法、贪心算法、回溯算法及分枝限界算法思想及应用实例。
2. 结构安排
全书共分为10章,各章主要内容如下。
第1章: 绪论。主要介绍数据结构和算法的基本概念和术语、C语言的数据类型及用C语言描述算法的要点、C++语言的类与抽象数据类型的关系、C++语言特性及与C语言程序的区别、C++语言验证算法的方法。
第2章: 线性表。主要介绍线性表的逻辑结构、线性表的顺序存储结构和链式存储结构、线性表的应用实例。
第3章: 栈和队列。主要介绍栈和队列的基本概念及存储结构、栈和队列的应用实例、递归的概念及设计方法、递归实现与栈的关系。
第4章: 数组和字符串。主要介绍数组存储结构及应用实例、字符串的基本概念和存储结构、字符串的应用实例。
第5章: 树。主要介绍树和二叉树的基本概念及存储结构、二叉树的应用——哈夫曼树及编码。
第6章: 图。主要介绍图的基本概念及存储结构、图的遍历、图的生成树和最小代价生成树、有向无环图、最短路径、图的应用实例。
第7章: 查找。主要介绍静态查找表、动态查找表、哈希表查找。
第8章: 排序。主要介绍插入排序、交换排序、选择排序、归并排序、基数排序、外部排序。
第9章: 常用算法设计技术。主要介绍蛮力算法、分治算法、贪心算法、回溯算法及分枝限界算法的思想及应用技巧。
第10章: 标准模板库。简单介绍标准模板库的组成及使用要点,同时介绍STL的应用实例。
本书第1、6、9章由陈媛教授编写,第2、5章由何波副教授编写,第3、4章由卢玲副教授编写,第7、8、10章由刘恒洋副教授编写。全书由陈媛教授统稿。
带*的内容为可选内容,不必要求讲解。
3. 本书特点
本书给出的所有算法和程序都采用C语言描述并调试通过,部分算法还增加了C++实现代码,用C和C++两种语言描述算法和数据结构,使数据结构的学习与随后的程序设计课程紧密结合。本书注重可读性和实用性,书中附有大量的图表、程序,使读者能正确、直观地理解问题; 书中每章都有学习要点、习题和上机练习,既便于教学,又便于自学。
本书内容和结构体现了教学改革成果。全书由重庆市精品课程“数据结构”重庆理工大学课程组的教师编写完成。作者都是长期在高校从事“算法与数据结构”教学的一线教师,有丰富的教学经验和软件开发能力。作者从多年的教学经验和多项教研课题的研究成果中,构建了数据结构概念建立和编程思想培养的框架体系,总结提炼了学习本课程的重难点和解决方法,大部分样例都经过整理和组织,以便读者更好地理解掌握。同时,本书获“重庆理工大学教材建设基金资助”。




4. 适用对象
本书只要求读者具有C 语言基础,不要求具有面向对象程序设计基础,通过本书的学习可帮助读者树立面向对象的编程思想。本书可作为计算机专业、信息管理专业及其他相关专业的本专科教材,也可作为广大软件工作者的参考资料。本书既可作为“数据结构与算法”课程的教材,也可作为其他程序类课程的辅导教材。
由于作者水平有限,书中难免有疏漏之处,敬请读者批评指正,以便及时修改。
作者
2019年12月