Chapter 1 知识整理 22
1.1 类、对象和应用程序 22
类 22
统一方法 27
对象 28
应用程序 30
1.2 组织类 32
继承 32
包 39
1.3 异常 42
处理异常状况 42
异常与类:实例 43
1.4 数据结构 47
非独立实现的结构 47
独立实现结构 48
数据结构的含义? 51
1.5 基本结构化机制 51
内存 52
引用 53
数组 57
1.6 算法比较:增长阶分析 63
测算法的时间效率 63
情况复杂度 64
输入值的大小 65
算法比较 66
增长顺序 68
选择排序算法 69
常见的增长阶 72
小结 73
习题 74
Chapter 2 抽象数据类型——栈 87
2.1 抽象 87
信息隐藏 87
数据抽象 88
数据层次 89
前置条件和后置条件 90
Java接口 91
基于接口的多态性 94
2.2 栈 96
栈的操作 97
栈的用法 97
2.3 集合元素 99
常用集合 99
2.4 栈接口 103
异常情况 103
接口 106
应用实例 107
2.5 基于数组的栈实现 109
ArrayBoundedstack类 109
栈操作的定义 111
ArrayListStack类 117
2.6 应用程序:平衡表达式 120
平衡类 120
应用程序 125
软件架构 129
2.7 链表 129
数组与链表 129
LLNode类 131
链表操作 133
2.8 基于链接的栈 139
LinkedStack类 140
压栈操作 142
弹栈操作 145
其他栈操作 147
比较栈的实现方式 149
2.9 应用程序:后缀表达式评估器 150
讨论 150
后缀表达式求值 151
后缀表达式求值算法 152
错误处理 154
PostFixEvaluator类 155
PFixCLI类 157
2.10 栈变体 160
重新审视栈抽象数据类型 160
Java栈类和集合框架 161
小结 163
习题 165
Chapter 3 递归 180
3.1 递归定义、算法和程序 180
递归定义 180
递归计算 181
递归程序 184
阶乘的迭代解决方案 185
3.2 三个问题 185
验证递归算法 186
确定输入限制 187
编写递归方法 187
调试递归方法 188
3.3 数组的递归处理 188
二分查找 188
3.4 链表的递归处理 192
链表的递归性质 192
链表遍历 193
链表转换 196
3.5 塔 200
算法 200
方法 202
程序 204
3.6 分形 204
丁字方形的分形 205
变体 207
3.7 移除递归 208
递归的工作原理 209
尾调用消除 212
直接使用栈 214
3.8 何时使用递归解决方案 215
递归开销 215
低效算法 216
清晰度 218
小结 220
习题 220
Chapter 4 抽象数据类型——队列 236
4.1 队列 236
队列操作 237
使用队列 237
4.2 队列接口 238
应用实例 240
4.3 基于数组的队列实现 241
ArrayBoundedQueue类 241
ArrayUnboundedQueue类 248
4.4 交互式测试驱动程序 251
一般方法 252
ArrayBoundedQueue类的测试驱动 253
使用测试驱动程序 253
4.5 基于链接的队列实现 255
入队操作 256
出队操作 257
循环链表队列设计 259
比较队列实现 260
4.6 应用程序:回文 262
回文类 262
应用程序 264
4.7 队列变体 265
特殊情况 266
玻璃队列 266
双端队列 268
双向链表 270
Java库集合框架队列/双端队列 273
4.8 应用程序:平均等待时间 274
问题讨论和示例 275
Customer类 277
模拟 280
测试 285
4.9 并发、干扰和同步 285
Counter类 287
Java线程 288
干扰 291
同步 292
同步队列 294
并发与Java库集合类 298
小结 299
习题 300
Chapter 5 抽象数据类型——集合 313
5.1 集合接口 313
集合的前提 314
接口 314
5.2 实现基于数组的集合 315
5.3 应用程序:词汇密度 320
5.4 重新探讨比较对象 323
函数equals 323
Comparable接口 329
5.5 基于排序数组的集合的实现 330
参比元素 331
实现 332
以“拷贝”或“引用”的方式实现抽象数据类型 334
示例程序 337
5.6 基于链接的集合的实现 339
内部表示形式 340
运算 340
比较集合实现 344
5.7 集合变体 345
Java集合框架 345
Bag ADT 346
Set ADT 348
小结 351
习题 352
Chapter 6 抽象数据类型——列表 361
6.1 列表接口 361
迭代 361
列表假设 363
接口 363
6.2 列表实现 365
基于数组的实现 365
基于链表的实现 370
6.3 应用程序:纸牌和游戏 375
Card类 376
CardDeck类 378
应用程序:排列Card Hand 380
应用程序:Higher or Lower 383
应用程序:一对牌有多罕见 385
6.4 基于数组的有序列表的实现 388
插入排序 388
不支持的操作 390
Comparator接口 390
构造函数 392
应用实例 393
6.5 列表变体 395
Java库列表 395
链表变体 395
链表作为节点数组 396
6.6 应用程序:大整数 400
大整数 400
内部表示 401
LargeIntList类 402
LargeInt类 407
加法和减法 410
LargeIntCLI程序 418
小结 422
习题 424
Chapter 7 抽象数据类型——二叉搜索树 437
7.1 树 437
树的遍历 440
7.2 二叉搜索树 443
二叉树 443
二叉搜索树 445
二叉树遍历 447
7.3 二叉搜索树接口 449
接口 449
7.4 实现层级:基础级 453
7.5 迭代法VS递归法的实现 457
size函数的递归法 457
size函数的迭代法 460
递归还是迭代 462
7.6 实现层级:剩余的观察函数 462
contains和get函数 462
遍历 465
7.7 实现层级:转换函数 468
add操作 468
remove操作 473
7.8 二叉搜索树的功能 479
重新讨论文本分析实验 479
插入顺序和树形 481
平衡二叉搜索树 482
7.9 应用程序:词频计数器 484
类WordFreq 485
应用程序 486
7.10 树的变体 492
特定应用的变体 492
平衡搜索树 495
小结 498
习题 500
Chapter 8 抽象数据类型——Map 514
8.1 Map接口 514
8.2 Map的实现 520
无序数组 520
有序数组 521
无序链表 521
有序链表 521
二叉搜索树 522
以基于ArrayList的方式实现 522
8.3 应用程序:从字符串到字符串的Map 526
8.4 哈希法 530
冲突 532
8.5 哈希函数 538
数组大小 538
哈希函数 539
Java对哈希的支持 543
复杂度 544
8.6 基于哈希的Map 544
实现 545
使用HMap类 551
8.7 Map的变体 553
混合结构 553
Java对Map的支持 555
小结 556
习题 556
Chapter 9 抽象数据类型——优先级队列 566
9.1 优先级队列接口 566
使用优先级队列 566
接口 567
9.2 优先级队列的实现 568
无序数组 568
有序数组 568
有序链表 569
二叉搜索树 570
9.3 堆 570
9.4 堆的实现 576
二叉树的非链接表示 576
实现堆 578
Enqueue(入队)方法 581
Dequeue(出队)方法 583
应用实例 587
堆VS优先级队列的其他表示 589
小结 590
习题 590
Chapter 10 抽象数据类型——图 598
10.1 图的介绍 598
10.2 图的接口 602
10.3 图的实现 605
基于数组的实现 605
链接实现 610
10.4 应用程序:图的遍历 611
深度优先搜索 612
广度优先搜索 616
10.5 应用程序:单源最短路径问题 619
小结 625
习题 626
Chapter 11 排序和查找算法 635
11.1 排序 635
测试工具 636
11.2 简单排序 638
选择排序 639
冒泡排序 644
插入排序 648
11.3 O(Nlog2N)排序 651
合并排序 652
快速排序 659
堆排序 665
11.4 更多的排序思考 670
测试 671
效率 671
对象和引用 673
比较对象 673
稳定性 674
11.5 查找 675
顺序查找 675
高概率排序 676
有序集合 677
哈希法 677
小结 678
习题 679
附录A 685
附录B 686
附录C 687
附录D 688
术语表 689
索引 696