编辑推荐
《世界著名计算机教材精选:数据结构与算法分析(C++语言描述 第2版)》介绍了三个主题:抽象数据类型(ADT)、数据结构和算法分析:
·往例子中广泛地使用OOD和OOP技术
·以UML风格图形显示ADT需求规格说明的统一的方法
·为几乎所有ADT提供了完整的源代码
·每章前面有章节目标,每章末尾有本章小结
·提供了丰富的案例学习
·给出了大量的小测验,并在书后提供答案
·大量的编写练习和编程问题
内容简介
数据结构是计算机科学专业的核心课程之一。对数据结构的传统学习,拓展到了对抽象数据类型(ADT)的学习。《世界著名计算机教材精选:数据结构与算法分析(C++语言描述 第2版)》主要介绍了三个主题:抽象数据类型(ADT)、数据结构和算法分析,并给出了用C++语言对数据结构及其算法的实现。《世界著名计算机教材精选:数据结构与算法分析(C++语言描述 第2版)》为几乎所有ADT提供了完整的源代码,并有丰富的案例学习,同时还给出了大量的编写练习和编程问题,以及大量的小测验,在书后提供了答案,供读者自我检测和学习。
《世界著名计算机教材精选:数据结构与算法分析(C++语言描述 第2版)》可作为大专院校计算机或软件专业的教材,也可以作为从事计算机工程与应用的科技人员的参考用书。
内页插图
目录
第1章 软件开发
1.1 问题分析和需求规格说明
1.2 设计
1.2.1 自顶向下设计
1.2.2 面向对象设计
1.2.3 小规模设计
1.3 编码
1.4 测试、运行和调试
1.5 维护
1.6 本章小结
第2章 抽象数据类型入门
2.1 对ADT及其实现的第一瞥
2.2 C++的简单数据类型
2.2.1 整型数据
2.2.2 实型数据
2.2.3 字符数据
2.4.4 布尔数据
2.3 程序员定义的数据类型
2.3.1 Typedefs
2.3.2 枚举
2.3.3 类
2.4 指针
2.4.1 声明和初始化指针
2.4.2 基本指针操作
2.4.3 动态内存分配-new操作
2.4.4 关于引用形参的注释
2.5 本章小结
第3章 数据结构和抽象数据类型
3.1 数据结构,抽象数据类型和实现
3.2 静态数组
3.2.1 一维静态数组
3.2.2 下标运算
3.2.3 数组作为形参
3.2.4 越界错误
3.2.5 数组的问题
3.3 多维数组
3.3.1 二维数组
3.3.2 高维数组
3.3.3 数组的数组声明
3.3.4 多维数组作函数参数
3.4 动态数组
3.4.1 new操作--动态数组
3.4.2 指针的其他用法
3.5 C风格结构(可选)指向结构的指针
3.6 过程式编程过程式编程的例子
3.7 本章小结
4章OOP和ADT进阶--类
4.1 过程式编程vs.面向对象编程
4.2 类
4.2.1 “传统的”(C)结构和OOP(C++)结构以及类之间的区别
4.2.2 类声明
4.3 例子:用户定义的Time类的第一个版本
4.3.1 为什么不使所有成员都公有化
4.3.2 实现一个类
4.3.3 一些现象
4.4 类构造函数
4.5 其他类操作
4.5.1 复制操作--初始化和赋值
4.5.2 访问函数和更动函数
4.5.3 重载运算符
4.5.4 重载输入/输出运算符
4.5.5 其他操作:前进和关系操作
4.5.6 总结以及其他些细节
4.5.7 指向类对象的指针
4.5.8 this指针
4.6 本章小结
第5章 标准C++输入/输出和字符串类
5.1 C++标准I/O类
5.1.1 istream类
5.1.2 0stream类
5.1.3 文件I/O:ifstream和ofstream类
5.1.4 110类层次
5.2 C++String类型
5.2.1 C风格的字符串
5.2.2 一个字符串类
5.2.3 C++String类
5.2.4 String流
5.3 案例学习:文本编辑
5.4 模式匹配介绍(可选)
5.5 数据加密介绍(可选)
5.5.1 数据加密标准(Data Encryption Standard)
5.5.2 公共密钥加密(Public-Key Encryption)
5.6 本章小结
第6章 列表
6.1 作为ADT的列表设计和创建一个列表类
6.2 基于数组的列表实现
6.2.1 选择存储结构
6.2.2 实现操作
6.2.3 一个使用静态数组存储的列表类
6.3 使用动态分配的基于数组实现的列表
6.3.1 类中的动态分配--析构函数、复制构造函数和赋值运算符
6.3.2 最后一点
6.4 对链表的介绍
6.4.1 它们是什么
6.4.2 实现基本列表操作
6.4.3 小结
6.5 在C++中基于指针来实现链表
6.5.1 节点结构
6.5.2 链表实现中的数据成员
6.5.3 链表实现中的函数成员
6.6 基于数组的链表实现
6.6.1 节点结构
6.6.2 存储池管理
6.7 本章小结
第7章 栈
7.1 栈的介绍
7.2 设计和创建一个Stack类--基于数组
7.2.1 选择存储结构
7.2.2 实现操作
7.2.3 实现pop操作的算法
7.2.4 完整的Stack类
7.2.5 使用动态数组存储栈元素
……
第8章 队列
第9章 ADT实现:模板和标准容器
第10章 ADT实现--递归、算法分析以及标准算法
第11章 其他链表结构
第12章 二叉树和散列表
第13章 排序
第14章 OOP和ADT
第15章 树
第16章 图和有向图
附录A ASCII字符集
附录B 小测验答案
前言/序言
本书的第1版来自于对作者在长达20年的时间里教授一门数据结构入门课程(通常是CS2)的经验的总结。接着发展成为由Joel Adams和Larry Nyhoff编著的,被广泛使用的“C++:An Introduction to Computing”,一本起源于他们多年来以C++教授的第一门程序设计课程(CS1)的书籍。但是计算机科学教学目录随着教育方法和方法学的改变也改变了。为了跟上这些变化,这本入门性质的C++教材也经过了修订,最近推出了第3版。
计算中的第二门课程的内容也发生了变化,其中一个主要的趋势,是将对数据结构的传统学习,拓展到了对抽象数据类型(ADT)的学习。作为结果,在这个新版本中,对ADTs的强调又加强了。并且如大家所期望的,在本书中也相应地增加了对面向对象设计的强调。
此外,作者的教学方法是经过多年成功教学的考验的。① 为了反映这方面的成功,这个新版本中的内容表述经过了一些改进,对讲述主题中的一些进行了重新安排,重写了某些章节,并添加了一些新的内容。其中很多建议都来自于那些认真并且完整地审阅本书原稿和几个版本修订稿的人。他们建设性的意见和正面的评价都非常令人鼓舞,也令人非常感激。
致指导教师
如果你使用过第1版并且喜欢它,我相信你将会更喜欢这个新版本。通过浏览前言后面部分对于本书的概览以及新特点列表,可以知道有哪些改进。对于没有使用过或停止使用第1版,并且正在将这个版本作为几本候选书籍考察的教师来说,我希望你们能认真地考虑一下本书。我已经尽力保留第1版中的优点,根据很多来自CS2的老师和学生,以及前一版用户的反馈,作出了很多修改。
作为已经在我的班级中使用很好的方法的一个示范,考察一下第7章中的栈。从一些能够由LIFO结构最好地建模的现实世界现象的例子中,可以抽象出很多共同的特性,这就得到了一个栈ADT。但是ADTSs必须使用某种语言能够提供的数据结构实现,所以我们创建了一个栈类(顺便说一下,当在班级中做这些时,我的学生们正处于创建一个队列类的实验阶段)。
当这个新的STACK类型被创建并经过测试,我们可以使用它来解决一个或更多的原始问题,并通常至少用于一个新的应用。我还相信,应该从一种简单的实现开始(例如,使用一个静态的C风格数组)并获得一个能工作的版本。接着,强调保留一个ADT的公有接口的必要性,我们重新定义它——例如,使用一个动态数组,这样用户可以规定栈的容量;再接下来,使用一个链表,这样就可以不需要预先规定栈容量;最终,将其转换为一个模板,这样这个ADT就可以使用任意类型的元素。这种螺旋式/持续精化的方法清楚地演示了一个ADT的“抽象”部分,即它和实现是无关的。
我还覆盖了很多在C++的标准模板库(STL)中提供的容器,因为其中的一些,例如vector,是非常有用也非常强大的,并且也没有必要费力的重新自己创建一个版本。不过,其他的一些,例如STL的stack和queue,是其他容器的适配器,并且浪费了这些内部容器的很多能力。对于这些ADT,我们使用低级的数据结构,例如数组和链表,创建自己的“平庸但倾斜”的实现,就显得很有意义了。本书还为学生提供了练习,要求学生为某些标准容器并不适合的问题创建定制的容器类型。
对于可以使用本书进行教授的课程,存在着很大的灵活性。特别地,很多
主题可以按照和本书不同的次序来进行。下一页中的图说明了不同章节之间的主要
依赖关系。从一个方框到另一个方框的箭头表示第二个方框中的内容非常依赖于第一个方框中的内容;例如,第9章中的材料需要同时用到第7章和第8章中的材料。一个虚线箭头表示第一个方框中的内容可能已经在前面的课程中学过,并且可以被省略掉,或回顾一下即可。对于互相之间没有连接的方框,在很大程度上是互相独立的(例如,第7章和第8章)。
致学生(以及本书的其他用户)
你可能不会阅读绝大多数教科书的前言,除非你的指导教师将此作为作业并接下来可能会对你进行测验。不过,对于本书,你应该至少阅读“本书概览”这一部分,因为它的目的就在于提供对以下内容的定位:本书是用于什么的,具有哪些主题,如何将它们结合到一起。出于同样的原因,还应该从头到尾浏览一遍本书的内容列表。
本书中覆盖的主题就是紧接着第一门编程课程之后的课程中会涉及的那些典型主题。这两门课程结合起来的主要目的在于为你提供关于计算的一个坚实的介绍。你不但锻炼了为解决小问题编写实质性程序的技能,而且还获得了对计算中重要概念和技术的介绍。这两门课程应该为你提供一个坚实的基础,使得不论你在什么学习领域内进行探索时,都能够使用计算机作为解决问题的工具。如果你要学习计算机科学中更多的课程,那么努力学习掌握这第二门课程中的内容是很重要的,因为这里覆盖的主题是一些更高级的课程的基础。实际上,在很多学院和大学中,这门课程是计算机科学中高级课程的先行课。
本书假设你已经具有编程入门知识,特别指使用C++或Java。
随着你通读本书,你一定要使用小测验来检查你是否已经掌握了读过内容的一些 主要思想。这些小测验的答案在附录B中。在这些自测试小测验的后面通常都会有练 习,其中一些可能会被你的指导老师作为作业布置。还应该鼓励自己尝试其中的一些,即使没有被要求,因为这些练习能帮助你掌握相关内容。对于每章结尾的编程问题,也是一样的。
本书中所有示例程序的C++代码都可以从作者为本书建立的Web站点下载:http://cs.calvin.edu/books/c++/ds。所以如果当你看到一个例子中某个特别的函数可以用在你正在编写的一个程序或一个类库中,那么尽管下载并使用它(当然,除非你的指导老师禁止你这么做)。
但愿你能享受阅读和学习本书。数百名我的学生已经使用了本书的早期版本,很少有抱怨的。但是他们也很乐于查找错误并通知我!我希望你们也能告诉我在你们使用中发现的任何错误;尽管在本书出版之前已经进行了长时间的“调试”,但是仍然会有错误的。我无法为你们发现错误而奖励你们一些课程分数,但是我将在本书Web站点的错误发现者列表中添加你的名字,以认可你对改进本书所做的贡献。
本书概览
如本书书名所提示的,书中一共包含3个主题:
* 抽象数据类型(ADT)
* 数据结构
* 算法分析
抽象数据类型由数据元素集合以及在数据之上的基本操作构成。本书中几乎每一章都涉及ADT的某个方面,定义一个ADT,例如列表、栈或者队列;学习ADT的某些应用;实现ADT或学习ADT在某个库中的实现;考察改进ADT实现的方法。
在实现ADT的时候,类起着关键的作用,因为类使得能够将数据和操作封装起来,从而对象不仅能够存储数据,还具有内建的操作。这是面向对象编程的主要属性之一,也是从一开始就强调的。C++中提供的数据结构(例如,数组)或C++中能够创建的数据结构(例如,链表)在为一种ADT提供存储数据元素的结构时扮演着关键的角色。为此,我们将学习这些关键数据结构以及来自标准模板库(STL)的最新的功能强大的容器。
第三个主题是算法分析。第1章描述了一些用于开发问题解决方案的软件工程方法,相应的内容强调了在设计阶段对面向对象设计(OOD)的使用。这是对“C++:An Introduction to Computing”一书中以对象为中心的设计方法(OCD)的自然发展,这和很多其他编程入门书籍中介绍的方法很类似。本书中包含很多例子,包括一些案例学习,可以说明ADT在问题求解中所起的作用。
ADT操作的实现牵涉到设计执行操作的算法。这表示对算法的学习也是对ADT的学习中关键的一步,而本书提供了很多算法的例子。这包括查找和排序算法,以及一些来自标准模板库(STL)的强大的算法。另外,还会介绍并演示对算法效率的分析,这样,就第一次接触到了后续计算机科学课程中将使用的一种重要工具。
算法必须使用某种编程语言实现。因此本书还包含了一些C++的内容,特别是通常在第一门课程中不会覆盖到而学生们需要学习的高级内容。这包括递归、函数和类模板、继承以及多态性。这里陈述的C++特性都遵循C++的官方标准。此外,因为一些原因,也包括了一些适合于数据结构课程的C风格内容,这些原因有:很多学生将获得一份作为C程序员的工作;很多库和操作系统工具都是使用C或C风格语言编写的;C中提供的数据结构往往实现得非常高效,并且这些结构常被用来实现一些更现代化的标准数据类型。
本书的另一个特点是,通过包含例子和练习来介绍计算机科学的不同领域,从而延续了从“C++:An Introduction to Computing”一书开始的对计算机科学这个学科的描述,也因此为在计算机科学领域更深入的学习提供了一个坚实的基础。
世界著名计算机教材精选:数据结构与算法分析(C++语言描述 第2版) 下载 mobi epub pdf txt 电子书 格式