数据抽象和问题求解:C++语言描述(第四版)

数据抽象和问题求解:C++语言描述(第四版)
作 者: 卡雷诺 郭平 张敏
出版社: 清华大学出版社
丛编项: 国外经典教材计算机科学与技术
版权说明: 本书为公共版权或经版权方授权,请支持正版图书
标 签: 语言 程序设计
ISBN 出版时间 包装 开本 页数 字数
未知 暂无 暂无 未知 0 暂无

作者简介

  FrankM.Carrano:Syracuse大学博士毕业,现任RhodeIsland大学计算科学系教授。主要研究方向为数据投影象技术、教育软件及多媒体技术。编写过多部著作,如DataAbstractionandProblemSolvingwithJava:WallsandMirrors和IntermediateProblemSolvingandDataStructures:WallsandMirrors。译者,郭平,女,1962年生,硕士,教授,毕业于湖南大学。一直从事计算机网络与通信高级程序设计、网络系统安全方面的教学、科研和开发工作;取得多项科研、学术成果,在核心期刊、国际国内会议上发表论文30余篇。编著出版教材和译著5本,获军队科技进步奖励3项。主要研究领域:计算机网络系统设计、网络性能分析、Web应用系统。

内容简介

本书主要论述数据抽象和其他解决问题的工具,是计算机科学的第二门课。本书旨在使学生切实了解和掌握数据抽象、面向对象编程及其他主流的问题解决技术。本书分两部分。第I部分是问题解决技术,主要介绍了编程和软件工程的主要问题,分析了递归、数据抽象和链表。第II部分用ADT解决问题。这部分主要介绍了栈、队列、树、表、堆和优先队列的基本ADT,还讨论了数量阶分析和大O表示法,规范了以前讨论的算法效率。第II部分还包括平衡查找树(2-3树、2-3-4树、红-黑树和AVL树)和散列等高级主题,并用它们实现表。最后分析外部直接访问文件的数据存储。本书列举了大量实例,范围很广,既可用作初级数据结构教材,也可用作高级编程和问题解决教材。

图书目录

第1部分 问题解决技术

第1章 编程原理与软件工程 3

1.1 问题求解与软件工程 3

1.1.1 问题求解的含义 3

1.1.2 软件的生命周期 4

1.1.3 优秀解决方案的含义 10

1.2 模块化设计 11

1.2.1 抽象与信息隐藏 11

1.2.2 面向对象的设计 13

1.2.3 自上而下的设计 14

1.2.4 一般设计原则 15

1.2.5 使用UML为面向对象的设计

建模 15

1.2.6 面向对象方式的优点 17

1.3 关键编程问题 18

1.3.1 模块化 18

1.3.2 可修改 19

1.3.3 易用 21

1.3.4 防故障编程 21

1.3.5 风格 25

1.3.6 调试 30

1.4 小结 31

1.5 提示 32

1.6 自我测试题 32

1.7 练习题 33

1.8 编程问题 35

第2章 递归:镜子 37

2.1 递归解决方案 37

2.1.1 递归值函数:n的阶乘 39

2.1.2 递归void函数:逆置字符串 43

2.2 计数 52

2.2.1 兔子繁殖(Fibonacci序列) 52

2.2.2 组织游行队伍 53

2.2.3 Spock的困惑 56

2.3 数组查找 57

2.3.1 查找数组的最大项 58

2.3.2 折半查找 59

2.3.3 查找数组中的第k个最小项 62

2.4 组织数据 64

2.5 递归与效率 69

2.6 小结 72

2.7 提示 72

2.8 自我测试题 73

2.9 练习题 73

2.10 编程问题 79

第3章 数据抽象:墙 80

3.1 抽象数据类型 80

3.2 指定ADT 83

3.2.1 ADT列表 84

3.2.2 ADT有序表 88

3.2.3 设计ADT 89

3.2.4 公理 92

3.3 实现ADT 94

3.3.1 C++类 95

3.3.2 C++命名空间 102

3.3.3 基于数组的ADT列表实现 104

3.3.4 C++异常 109

3.3.5 使用异常的ADT列表实现 110

3.4 小结 112

3.5 提示 113

3.6 自我测试题 113

3.7 练习题 114

3.8 编程问题 116第4章 链表 117

4.1 预备知识 117

4.1.1 指针 118

4.1.2 数组的动态分配 123

4.1.3 基于指针的链表 124

4.2 链表编程 125

4.2.1 显示链表的内容 126

4.2.2 从链表中删除指定的节点 127

4.2.3 在链表的指定位置插入节点 129

4.2.4 ADT列表的基于指针的实现 133

4.2.5 比较基于数组的实现和基于

引用的实现 139

4.2.6 使用文件存储和恢复链表 140

4.2.7 将链表传给函数 143

4.2.8 递归地处理链表 144

4.2.9 把对象作为链表的数据 148

4.3 链表的各种变化 148

4.3.1 循环链表 148

4.3.2 虚拟头节点 150

4.3.3 双向链表 150

4.4 清单应用程序 152

4.5 C++标准模板库 156

4.5.1 容器 157

4.5.2 迭代器 157

4.5.3 标准模板库类list 158

4.6 小结 162

4.7 提示 164

4.8 自我测试题 165

4.9 练习题 167

4.10 编程问题 169

第5章 递归问题解决技术 172

5.1 回溯 172

5.1.1 八皇后问题 172

5.1.2 使用STL类vector解决八皇后

问题 174

5.2 定义语言 178

5.2.1 语法知识基础 179

5.2.2 两种简单语言 180

5.2.3 代数表达式 182

5.3 递归和数学归纳法的关系 189

5.3.1 factorial递归算法的正确性 189

5.3.2 Hanoi塔的成本 190

5.4 小结 191

5.5 提示 192

5.6 自我测试题 192

5.7 练习题 192

5.8 编程问题 195第2部分 使用抽象数据类型

解决问题

第6章 栈 201

6.1 抽象数据类型 201

6.2 ADT栈的简单应用 206

6.2.1 检查括号匹配 206

6.2.2 识别语言中的字符串 208

6.3 ADT栈的实现 209

6.3.1 ADT栈的基本数组的实现 209

6.3.2 ADT栈的基于指针的实现 213

6.3.3 使用ADT列表的实现 217

6.3.4 各种实现方式的比较 221

6.3.5 标准模板库类stack 221

6.4 应用:代数表达式 223

6.4.1 计算后缀表达式 223

6.4.2 中缀表达式与后缀表达式的

等价转换 224

6.5 应用:查找问题 227

6.5.1 使用栈的非递归解决方案 228

6.5.2 递归解决方案 234

6.6 栈和递归的关系 236

6.7 小结 238

6.8 提示 238

6.9 自我测试题 238

6.10 练习题 239

6.11 编程问题 242

第7章 队列 247

7.1 ADT队列 247

7.2 ADT队列的简单应用 249

7.2.1 读取字符串 249

7.2.2 识别回文 250

7.3 实现ADT队列 251

7.3.1 基于指针的实现 251

7.3.2 基于数组的实现 256

7.3.3 使用ADT列表的实现 261

7.3.4 标准模板库类queue 263

7.3.5 实现的比较 266

7.4 基于位置的ADT总览 266

7.5 模拟应用 267

7.6 小结 275

7.7 提示 275

7.8 自我测试题 275

7.9 练习题 276

7.10 编程问题 278

第8章 类关系 282

8.1 继承 282

8.1.1 公有、私有和受保护的继承 287

8.1.2 is-a、has-a和As-a关系 288

8.2 虚函数和后期绑定 290

8.3 友元 297

8.4 ADT列表和有序表 299

8.5 类模板 304

8.6 重载运算符 310

8.7 迭代器 313

8.8 小结 318

8.9 提示 319

8.10 自我测试题 319

8.11 练习题 319

8.12 编程问题 323

第9章 算法效率和排序 325

9.1 确定算法效率 325

9.1.1 算法的执行时间 326

9.1.2 算法增率 327

9.1.3 数量阶分析和大O表示法 328

9.1.4 正确分析问题 331

9.1.5 查找算法的效率 332

9.2 排序算法及其效率 333

9.2.1 选择排序 333

9.2.2 起泡排序 336

9.2.3 插入排序 337

9.2.4 归并排序 339

9.2.5 快速排序 344

9.2.6 基数排序 352

9.2.7 各种排序算法的比较 354

9.2.8 标准模板库排序算法 355

9.3 小结 359

9.4 提示 360

9.5 自我测试题 360

9.6 练习题 361

9.7 编程问题 363

第10章 树 366

10.1 术语 366

10.2 ADT二叉树 372

10.2.1 二叉树的遍历 375

10.2.2 二叉树的表示 378

10.2.3 ADT二叉树的基于指针的

实现 381

10.3 ADT二叉查找树 393

10.3.1 ADT二叉查找树操作的

算法 397

10.3.2 ADT二叉查找树的基于指针

的实现 408

10.3.3 二叉查找树操作的效率 416

10.3.4 树排序 419

10.3.5 将二叉查找树保存到文件 419

10.3.6 STL查找算法 422

10.4 一般树 424

10.5 小结 426

10.6 提示 426

10.7 自我测试题 427

10.8 练习题 428

10.9 编程问题 433

第11章 表和优先队列 435

11.1 ADT表 435

11.1.1 选择实现 439

11.1.2 ADT表的基于数组的有序

实现 444

11.1.3 ADT表的二叉查找树实现 448

11.2 ADT优先队列:ADT表的

变体 451

11.2.1 堆 454

11.2.2 ADT优先队列的堆实现 462

11.2.3 堆排序 464

11.3 STL中的表和优先队列 466

11.3.1 STL关联容器 466

11.3.2 STL的priority_queue类和

堆算法 474

11.3 小结 477

11.4 提示 478

11.5 自我测试题 478

11.6 练习题 479

11.7 编程问题 481

第12章 表的高级实现 483

12.1 平衡查找树 483

12.1.1 2-3树 484

12.1.2 2-3-4树 499

12.1.3 红-黑树 504

12.1.4 AVL树 506

12.2 散列 510

12.2.1 散列函数 513

12.2.2 解决冲突 515

12.2.3 散列的效率 521

12.2.4 如何确立散列函数 523

12.2.5 表遍历:散列的低效操作 525

12.2.6 使用STL实现

HashMap类 525

12.3 按多种形式组织数据 528

12.4 小结 531

12.5 提示 532

12.6 自我测试题 532

12.7 练习题 533

12.8 编程问题 535

第13章 图 536

13.1 术语 536

13.2 将图作为ADT 538

13.2.1 实现图 539

13.2.2 使用STL实现Graph类 541

13.3 图的遍历 544

13.3.1 深度优先查找 545

13.3.2 广度优先查找 546

13.3.3 使用STL实现BFS类 548

13.4 图的应用 550

13.4.1 拓扑排序 550

13.4.2 生成树 552

13.4.3 最小生成树 555

13.4.4 最短路径 556

13.4.5 回路 560

13.4.6 一些复杂问题 563

13.5 小结 563

13.6 提示 564

13.7 自我测试题 564

13.8 练习题 565

13.9 编程问题 567

第14章 外部方法 569

14.1 了解外部存储 569

14.2 排序外部文件的数据 571

14.3 外部表 577

14.3.1 确定外部文件的索引 579

14.3.2 外部散列 582

14.3.3 B-树 584

14.3.4 遍历 590

14.3.5 多索引 593

14.4 小结 594

14.5 提示 594

14.6 自我测试题 595

14.7 练习题 595

14.8 编程问题 597

附录A C++基础 599

附录B ASCII字符代码 653

附录C C++头文件和标准函数 655

附录D 数学归纳法 659

附录E 标准模板库 663

术语表 673

自我测试题答案 690