Data Structures: Abstraction and Design Using Java offers a coherent and well-balanced presentation of data structure implementation and data structure applications with a strong emphasis on problem solving and software design. Step-by-step, the authors introduce each new data structure as an abstract data type (ADT), explain its underlying theory and computational complexity, provide its specification in the form of a Java interface, and demonstrate its implementation as one or more Java classes. Case studies using the data structures covered in the chapter show complete and detailed solutions to real-world problems, while a variety of software design tools are discussed to help students “Think, then code.”
The book supplements its rigorous coverage of basic data structures and algorithms with chapters on sets and maps, balanced binary search trees, graphs, event-oriented programming, testing and debugging, and other key topics. Now available as an enhanced e-book, the fourth edition of Data Structures: Abstraction and Design Using Java enables students to measure their progress after completing each section through interactive questions, quick-check questions, and review questions.
Table of Contents
Preface iii
Chapter 1 Object-Oriented Programming and Class Hierarchies 1
1.1 Abstract Data Types (ADTs), Interfaces, and the Java API 2
Interfaces 2
The implements Clause 5
Declaring a Variable of an Interface Type 6
Exercises for Section 1.1 6
1.2 Introduction to OOP 7
A Superclass and Subclass Example 8
Use of this. 9
Initializing Data Fields in a Subclass 10
The No-Parameter Constructor 11
Protected Visibility for Superclass Data Fields 11
Is-a versus Has-a Relationships 12
Exercises for Section 1.2 12
1.3 Method Overriding, Method Overloading, and Polymorphism 13
Method Overriding 13
Method Overloading 15
Polymorphism 17
Methods with Class Parameters 17
Exercises for Section 1.3 18
1.4 Abstract Classes 19
Referencing Actual Objects 21
Initializing Data Fields in an Abstract Class 21
Abstract Class Number and the Java Wrapper Classes 21
Summary of Features of Actual Classes, Abstract Classes, and Interfaces 22
Implementing Multiple Interfaces 23
Extending an Interface 23
Exercises for Section 1.4 24
1.5 Class Object and Casting 24
The Method toString 24
Operations Determined by Type of Reference Variable 25
Casting in a Class Hierarchy 26
Using instanceof to Guard a Casting Operation 27
The Class Class 29
Exercises for Section 1.5 29
1.6 A Java Inheritance Example - The Exception Class Hierarchy 30
Division by Zero 30
Array Index Out of Bounds 30
Null Pointer 31
The Exception Class Hierarchy 31
The Class Throwable 31
Checked and Unchecked Exceptions 32
Handling Exceptions to Recover from Errors 34
Using try-catch to Recover from an Error 35
Throwing an Exception When Recovery Is Not Obvious 35
Exercises for Section 1.6 36
1.7 Packages and Visibility 37
Packages 37
The No-Package-Declared Environment 37
Package Visibility 38
Visibility Supports Encapsulation 38
Exercises for Section 1.7 39
1.8 A Shape Class Hierarchy 40
Case Study: Processing Geometric Figures 40
Exercises for Section 1.8 46
Chapter Review 46
Java Constructs Introduced in This Chapter 47
Java API Classes Introduced in This Chapter 47
User-Defined Interfaces and Classes in This Chapter 47
Quick-Check Exercises 47
Review Questions 48
Programming Projects 49
Answers to Quick-Check Exercises 51
Chapter 2 Lists and the Collections Framework 53
2.1 Algorithm Efficiency and Big-O 54
Big-O Notation 56
Formal Definition of Big-O 57
Summary of Notation 60
Comparing Performance 60
The Power of O(log n) Algorithms 62
Algorithms with Exponential and Factorial Growth Rates 62
Exercises for Section 2.1 63
2.2 The List Interface and ArrayList Class 63
The ArrayList Class 65
Generic Collections 67
Exercises for Section 2.2 69
2.3 Applications of ArrayList 70
A Phone Directory Application 71
Exercises for Section 2.3 72
2.4 Implementation of an ArrayList Class 72
The Constructor for Class KWArrayList 73
The add(E anEntry) Method 74
The add(int index, E anEntry) Method 75
The set and get Methods 76
The remove Method 76
The reallocate Method 77
Performance of the KWArrayList Algorithms 77
Exercises for Section 2.4 77
2.5 Single-Linked Lists 78
A List Node 80
Connecting Nodes 81
A Single-Linked List Class 81
Inserting a Node in a List 82
Removing a Node 83
Completing the KWSingleLinkedList Class 84
The get and set Methods 85
The add Methods 85
Exercises for Section 2.5 86
2.6 Double-Linked Lists and Circular Lists 87
The Node Class 88
Inserting into a Double-Linked List 88
Removing from a Double-Linked List 89
A Double-Linked List Class 90
Circular Lists 90
Exercises for Section 2.6 91
2.7 The LinkedList Class and the Iterator, ListIterator, and Iterable Interfaces 91
The LinkedList Class 91
The Iterator 92
The Iterator Interface 93
The Enhanced for Loop 95
The ListIterator Interface 95
Comparison of Iterator and ListIterator 97
Conversion between a ListIterator and an Index 97
The Iterable Interface 97
Exercises for Section 2.7 98
2.8 Application of the LinkedList Class 98
Case Study: Maintaining an Ordered List 99
Exercises for Section 2.8 105
2.9 Implementation of a Double-Linked List Class 105
Implementing the KWLinkedList Methods 106
A Class That Implements the ListIterator Interface 107
The Constructor 108
The hasNext and next Methods 108
The hasPrevious and previous Methods 109
The add Method 110
Inner Classes: Static and Nonstatic 112
Exercises for Section 2.9 113
2.10 The Collections Framework Design 114
The Collection Interface 114
Common Features of Collections 114
The AbstractCollection, AbstractList, and AbstractSequentialList Classes 116
The List and RandomAccess Interfaces (Advanced) 116
Exercises for Section 2.10 117
Chapter Review 117
Java API Interfaces and Classes Introduced in This Chapter 118
User-Defined Interfaces and Classes in this Chapter 119
Quick-Check Exercises 119
Review Questions 119
Programming Projects 120
Answers to Quick-Check Exercises 122
Chapter 3 Testing and Debugging 123
3.1 Types of Testing 124
Preparations for Testing 126
Testing Tips for Program Systems 126
Exercises for Section 3.1 127
3.2 Specifying the Tests 127
Testing Boundary Conditions 127
Exercises for Section 3.2 128
3.3 Stubs and Drivers 129
Stubs 129
Preconditions and Postconditions 129
Drivers 130
Exercises for Section 3.3 130
3.4 The JUnit5 Platform 130
Exercises for Section 3.4 135
3.5 Test-Driven Development 136
Exercises for Section 3.5 140
3.6 Testing Interactive Programs in JUnit 140
ByteArrayInputStream 141
ByteArrayOutputStream 141
Exercises for Section 3.6 142
3.7 Debugging a Program 143
Using a Debugger 144
The IntelliJ and Eclipse Debuggers 144
Exercises for Section 3.7 147
Chapter Review 148
Java API Classes Introduced in This Chapter 149
User-Defined Interfaces and Classes in This Chapter 149
Quick-Check Exercises 149
Review Questions 149
Programming Projects 149
Answers to Quick-Check Exercises 151
Chapter 4 Stacks, Queues, and Deques 152
4.1 Stack Abstract Data Type 153
Specification of the Stack Abstract Data Type 153
Exercises for Section 4.1 155
4.2 Stack Applications 156
Case Study: Finding Palindromes 156
Exercises for Section 4.2 160
4.3 Implementing a Stack 160
Implementing a Stack with an ArrayList Component 160
Implementing a Stack as a Linked Data Structure 162
Comparison of Stack Implementations 163
Exercises for Section 4.3 164
4.4 Additional Stack Applications 164
Case Study: Evaluating Postfix Expressions 165
Case Study: Converting from Infix to Postfix 170
Case Study: Converting Expressions with Parentheses 178
Tying the Case Studies Together 181
Exercises for Section 4.4 181
4.5 Queue Abstract Data Type 182
A Print Queue 182
The Unsuitability of a “Print Stack” 183
A Queue of Customers 183
Using a Queue for Traversing a Multi-Branch Data Structure 183
Specification for a Queue Interface 184
Class LinkedList Implements the Queue Interface 184
Exercises for Section 4.5 185
4.6 Queue Applications 186
Case Study: Maintaining a Queue 186
Exercises for Section 4.6 191
4.7 Implementing the Queue Interface 192
Using a Double-Linked List to Implement the Queue Interface 192
Using a Single-Linked List to Implement the Queue Interface 192
Using a Circular Array to Implement the Queue Interface 194
Overview of the Design 194
Implementing ArrayQueue 196
Increasing Queue Capacity 198
Implementing Class ArrayQueue.Iter 199
Comparing the Three Implementations 200
Exercises for Section 4.7 201
4.8 The Deque Interface 201
Classes that Implement Deque 202
Using a Deque as a Queue 203
Using a Deque as a Stack 203
Exercises for Section 4.8 204
Chapter Review 205
Java API Classes Introduced in This Chapter 205
User-Defined Interfaces and Classes in This Chapter 205
Quick-Check Exercises 206
Review Questions 207
Programming Projects 208
Answers to Quick-Check Exercises 211
Chapter 5 Recursion 213
5.1 Recursive Thinking 214
Steps to Design a Recursive Algorithm 216
Proving that a Recursive Method Is Correct 218
Tracing a Recursive Method 218
The Run-Time Stack and Activation Frames 219
Exercises for Section 5.1 220
5.2 Recursive Definitions of Mathematical Formulas 221
Tail Recursion versus Iteration 225
Efficiency of Recursion 225
Exercises for Section 5.2 228
5.3 Recursive Array Search 229
Design of a Recursive Linear Search Algorithm 229
Implementation of Linear Search 230
Design of a Binary Search Algorithm 231
Efficiency of Binary Search 232
The Comparable Interface 233
Implementation of Binary Search 233
Testing Binary Search 235
Method Arrays.binarySearch 236
Exercises for Section 5.3 236
5.4 Recursive Data Structures 236
Recursive Definition of a Linked List 237
Class LinkedListRec 237
Method size 237
Method toString 238
Method replace 238
Method add 239
Removing a List Node 239
Exercises for Section 5.4 240
5.5 Problem Solving with Recursion 241
Case Study: Towers of Hanoi 241
Case Study: Counting Cells in a Blob 246
Exercises for Section 5.5 250
5.6 Backtracking 250
Case Study: Finding a Path through a Maze 251
Exercises for Section 5.6 255
Chapter Review 255
User-Defined Classes in This Chapter 256
Quick-Check Exercises 256
Review Questions 256
Programming Projects 257
Answers to Quick-Check Exercises 258
Chapter 6 Trees 259
6.1 Tree Terminology and Applications 260
Tree Terminology 260
Binary Trees 261
Some Types of Binary Trees 262
General Trees 265
Exercises for Section 6.1 266
6.2 Tree Traversals 267
Visualizing Tree Traversals 268
Traversals of Binary Search Trees and Expression Trees 268
Exercises for Section 6.2 269
6.3 Implementing a BinaryTree Class 270
The Node Class 270
The BinaryTree Class 271
The Constructors 272
The getLeftSubtree and getRightSubtree Methods 273
The isLeaf Method 274
The toString Method 274
The Recursive toString Method 274
Exercises for Section 6.3 276
6.4 Lambda Expressions and Functional Interfaces 277
Functional Interfaces 278
A General Preorder Traversal Method 281
Using preOrderTraverse 282
Exercises for Section 6.4 282
6.5 Binary Search Trees 283
Overview of a Binary Search Tree 283
Performance 284
Interface SearchTree 284
The BinarySearchTree Class 285
Implementing the find Methods 286
Insertion into a Binary Search Tree 287
Implementing the add Methods 287
Removal from a Binary Search Tree 289
Implementing the delete Methods 291
Method findLargestChild 293
Testing a Binary Search Tree 294
Case Study: Writing an Index for a Term Paper 294
Exercises for Section 6.5 297
6.6 Heaps and Priority Queues 298
Inserting an Item into a Heap 298
Removing an Item from a Heap 299
Implementing a Heap 299
Performance of the Heap 302
Priority Queues 302
The PriorityQueue Class 303
The offer Method 305
The poll Method 306
The Other Methods 307
Exercises for Section 6.6 307
6.7 Huffman Trees 308
Case Study: Building a Custom Huffman Tree 309
Exercises for Section 6.7 315
Chapter Review 316
Java API Interfaces and Classes Introduced in This Chapter 317
User-Defined Interfaces and Classes in This Chapter 317
Quick-Check Exercises 317
Review Questions 318
Programming Projects 318
Answers to Quick-Check Exercises 321
Chapter 7 Sets and Maps 322
7.1 Sets and the Set Interface 323
The Set Abstraction 323
The Set Interface and Methods 325
Using Method of to Initialize a Collection 327
Comparison of Lists and Sets 327
Exercises for Section 7.1 328
7.2 Maps and the Map Interface 329
The Map Hierarchy 330
The Map Interface 330
Creating a Map 331
Exercises for Section 7.2 333
7.3 Hash Tables 333
Hash Codes and Index Calculation 334
Methods for Generating Hash Codes 335
Open Addressing 335
Table Wraparound and Search Termination 336
Traversing a Hash Table 338
Deleting an Item Using Open Addressing 338
Reducing Collisions by Expanding the Table Size 338
Algorithm for rehashing 339
Reducing Collisions Using Quadratic Probing 339
Problems with Quadratic Probing 340
Chaining 340
Performance of Hash Tables 341
Performance of Open Addressing versus Chaining 341
Performance of Hash Tables versus Sorted Arrays and Binary Search Trees 342
Storage Requirements for Hash Tables, Sorted Arrays, and Trees 342
Storage requirements for Open Addressing and Chaining 343
Exercises for Section 7.3 343
7.4 Implementing the Hash Table 345
Interface KWHashMap 345
Class Entry 345
Class HashtableOpen 346
Class HashtableChain 351
Testing the Hash Table Implementations 354
Exercises for Section 7.4 355
7.5 Implementation Considerations for Maps and Sets 355
Methods hashCode and equals 355
Implementing HashSetOpen 356
Writing HashSetOpen as an Adapter Class 356
Implementing the Java Map and Set Interfaces 357
Interface Map.Entry and Class AbstractMap.SimpleEntry 357
Creating a Set View of a Map 358
Method entrySet and Classes EntrySet and SetIterator 358
Classes TreeMap and TreeSet 359
Exercises for Section 7.5 360
7.6 Additional Applications of Maps 360
Case Study: Implementing a Cell Phone Contact list 360
Case Study: Completing the Huffman Coding Problem 362
Encoding the Huffman Tree 366
Exercises for Section 7.6 367
7.7 Navigable Sets and Maps 367
Application of a NavigableMap 369
Exercises for Section 7.7 371
7.8 Skip-Lists 371
Skip-List Structure 372
Searching a Skip-List 372
Performance of a Skip-List Search 373
Inserting into a Skip-List 373
Increasing the Height of a Skip-List 374
Implementing a Skip-List 374
SkipList Methods for Search and Retrieval 375
Method put for Inserting into a Skip-List 376
Constants and Methods for Computing Random Level 378
Performance of a Skip-List 378
Testing Class Skip-List 379
Exercises for Section 7.8 379
Chapter Review 380
Java API Interfaces and Classes Introduced in This Chapter 381
User-Defined Interfaces and Classes in This Chapter 381
Quick-Check Exercises 381
Review Questions 382
Programming Projects 383
Answers to Quick-Check Exercises 384
Chapter 8 Sorting 385
8.1 Using Java Sorting Methods 386
Collections.sort Methods 389
Method List.sort 389
Exercises for Section 8.1 390
8.2 Selection Sort 390
Analysis of Selection Sort 391
Implementation of Selection Sort 392
Exercises for Section 8.2 393
8.3 Insertion Sort 393
Analysis of Insertion Sort 395
Implementation of Insertion Sort 395
Exercises for Section 8.3 396
8.4 Comparison of Quadratic Sorts 397
Comparisons versus Exchanges 398
Exercises for Section 8.4 398
8.5 Shell Sort: A Better Insertion Sort 398
Analysis of Shell Sort 400
Implementation of Shell Sort 400
Exercises for Section 8.5 401
8.6 Merge Sort 402
Analysis of Merge 403
Implementation of Merge 403
Design of Merge Sort 404
Trace of Merge Sort Algorithm 404
Analysis of Merge Sort 405
Implementation of Merge Sort 406
Exercises for Section 8.6 406
8.7 Timsort 407
Merging Adjacent Runs 410
Performance of Timsort 410
Implementation of Timsort 411
Exercises for Section 8.7 414
8.8 Heapsort 414
First Version of a Heapsort Algorithm 414
Analysis of Revised Heapsort Algorithm 416
Implementation of Heapsort 417
Exercises for Section 8.8 418
8.9 Quicksort 418
Algorithm for Quicksort 419
Analysis of Quicksort 420
Implementation of Quicksort 420
Algorithm for Partitioning 421
Implementation of partition 422
A Revised partition Algorithm 424
Implementation of Revised partition Method 425
Exercises for Section 8.9 426
8.10 Testing the Sort Algorithms 427
Exercises for Section 8.10 428
8.11 The Dutch National Flag Problem (Optional Topic) 428
Case Study: The Problem of the Dutch National Flag 429
Exercises for Section 8.11 431
Chapter Review 432
Java Classes Introduced in This Chapter 432
User-Defined Classes in This Chapter 432
Quick-Check Exercises 433
Review Questions 433
Programming Projects 433
Answers to Quick-Check Exercises 434
Chapter 9 Self-Balancing Search Trees 435
9.1 Tree Balance and Rotation 436
Why Balance Is Important 436
Rotation 436
Algorithm for Rotation 437
Implementing Rotation 438
Exercises for Section 9.1 440
9.2 AVL Trees 440
Balancing a Left-Left Tree 440
Balancing a Left-Right Tree 441
Four Kinds of Critically Unbalanced Trees 442
Implementing an AVL Tree 444
The AVLNode Class 445
Inserting into an AVL Tree 446
add Starter Method 447
Recursive add Method 447
Initial Algorithm for rebalanceLeft 448
The Effect of Rotations on Balance 448
Revised Algorithm for rebalanceLeft 449
Method rebalanceLeft 449
The decrementBalance Method 450
Removal from an AVL Tree 451
Performance of the AVL Tree 452
Exercises for Section 9.2 452
9.3 Red-Black Trees 453
Insertion into a Red-Black Tree 453
Implementation of Red-Black Tree Class 458
Algorithm for Red-Black Tree Insertion 458
The add Starter Method 460
The Recursive add Method 461
Removal from a Red-Black Tree 462
Performance of a Red-Black Tree 462
The TreeMap and TreeSet Classes 463
Exercises for Section 9.3 463
9.4 2-3 Trees 464
Searching a 2-3 Tree 465
Inserting an Item into a 2-3 Tree 465
Inserting into a 2-Node Leaf 465
Inserting into a 3-Node Leaf with a 2-Node Parent 466
Inserting into a 3-Node Leaf with a 3-Node Parent 466
Analysis of 2-3 Trees and Comparison with Balanced Binary Trees 468
Removal from a 2-3 Tree 469
Exercises for Section 9.4 470
9.5 B-Trees and 2-3-4 Trees 470
B-Trees 471
Implementing the B-Tree 472
Code for the insert Method 474
The insertIntoNode Method 475
The splitNode Method 476
Removal from a B-Tree 478
B+ Trees 479
2-3-4 Trees 480
Relating 2-3-4 Trees to Red-Black Trees 481
Exercises for Section 9.5 482
Chapter Review 483
Java Classes Introduced in This Chapter 484
User-Defined Interfaces and Classes in This Chapter 484
Quick-Check Exercises 485
Review Questions 486
Programming Projects 486
Answers to Quick-Check Exercises 489
Chapter 10 Graphs 492
10.1 Graph Terminology 493
Visual Representation of Graphs 493
Directed and Undirected Graphs 494
Paths and Cycles 494
Relationship between Graphs and Trees 496
Graph Applications 496
Exercises for Section 10.1 497
10.2 The Graph ADT and Edge Class 497
Representing Vertices and Edges 498
Exercises for Section 10.2 499
10.3 Implementing the Graph ADT 499
Adjacency List 499
Adjacency Matrix 501
Overview of the Hierarchy 501
Declaring the Graph Interface 502
The ListGraph Class 503
Comparing Implementations 506
Exercises for Section 10.3 507
10.4 Traversals of Graphs 508
Breadth-First Search 508
Depth-First Search 513
Exercises for Section 10.4 519
10.5 Applications of Graph Traversals 519
Case Study: Shortest Path through a Maze 519
Case Study: Topological Sort of a Graph 523
Exercises for Section 10.5 526
10.6 Algorithms Using Weighted Graphs 526
Finding the Shortest Path from a Vertex to All Other Vertices 526
Analysis of Dijkstra’s Algorithm 528
Minimum Spanning Trees 530
Exercises for Section 10.6 533
10.7 A Heuristic Algorithm A* to Find the Best Path 534
A* (A-Star) an Improvement of Dijkstra’s Algorithm 535
Exercises for Section 10.7 541
Chapter Review 541
User-Defined Classes and Interfaces in This Chapter 542
Quick-Check Exercises 542
Review Questions 543
Programming Projects 543
Answers to Quick-Check Exercises 545
Appendix A Introduction to Java A-1
A.1 The Java Environment and Classes A-2
The Java Virtual Machine A-3
The Java Compiler A-3
Classes and Objects A-3
The Java API A-3
The import Statement A-4
Method main A-4
Execution of a Java Program A-5
Use of jshell A-5
Exercises for Section A.1 A-6
A.2 Primitive Data Types and Reference Variables A-6
Primitive Data Types A-6
Primitive-Type Variables A-8
Primitive-Type Constants A-8
Operators A-8
Postfix and Prefix Increment A-10
Type Compatibility and Conversion A-10
Referencing Objects A-11
Creating Objects A-11
Exercises for Section A.2 A-12
A.3 Java Control Statements A-13
Sequence and Compound Statements A-13
Selection and Repetition Control A-13
Nested if Statements A-15
The switch Statement A-16
Exercises for Section A.3 A-17
A.4 Methods and Class Math A-17
The Instance Methods println and print A-18
Call-by-Value Arguments A-18
The Class Math A-18
Escape Sequences A-19
Exercises for Section A.4 A-20
A.5 The String, StringBuilder, StringBuffer, and StringJoiner Classes A-21
The String Class A-21
Strings Are Immutable A-23
The Garbage Collector A-24
Comparing Objects A-24
The String.format Method A-25
The Formatter Class A-26
The String.split Method A-27
Introduction to Regular Expressions A-27
Matching One of a Group of Characters A-27
Qualifiers A-27
Defined Character Groups A-28
Unicode Character Class Support A-29
The StringBuilder and StringBuffer Classes A-29
StringJoiner Class A-31
Exercises for Section A.5 A-32
A.6 Wrapper Classes for Primitive Types A-33
Exercises for Section A.6 A-34
A.7 Defining Your Own Classes A-35
Private Data Fields, Public Methods A-38
Constructors A-39
The No-Parameter Constructor A-39
Modifier and Accessor Methods A-40
Use of this. in a Method A-40
The Method toString A-40
The Method equals A-41
Declaring Local Variables in Class Person A-42
An Application that Uses Class Person A-42
Objects as Arguments A-43
Classes as Components of Other Classes A-44
Java Documentation Style for Classes and Methods A-44
Exercises for Section A.7 A-47
A.8 Arrays A-47
Data Field length A-49
Method Arrays.copyOf A-50
Method System.arrayCopy A-50
Array Data Fields A-51
Array Results and Arguments A-52
Arrays of Arrays A-52
Exercises for Section A.8 A-55
A.9 Enumeration Types A-56
Using Enumeration Types A-57
Assigning Values to Enumeration Types A-58
Exercises for Section A.9 A-58
A.10 I/O Using Streams, Class Scanner, and Class JOptionPane A-58
The Scanner A-59
Using a Scanner to Read from a File A-61
Exceptions A-61
Tokenized Input A-61
Extracting Tokens Using Scanner.findInLine A-62
Using a BufferedReader to Read from an Input Stream A-62
Output Streams A-62
Passing Arguments to Method main A-63
Closing Streams A-63
Try with Resources A-63
A Complete File-Processing Application A-64
Input/Output Using Class JOptionPane A-65
Converting Numeric Strings to Numbers A-66
GUI Menus Using Method showOptionDialog A-66
Exercises for Section A.10 A-67
A.11 Catching Exceptions A-67
Catching and Handling Exceptions A-68
Exercises for Section A.11 A-74
A.12 Throwing Exceptions A-74
The throws Clause A-74
The throw Statement A-75
Exercises for Section A.12 A-78
Appendix Review A-79
Java Constructs Introduced in This Appendix A-81
Java API Classes Introduced in This Appendix A-81
User‐Defined Interfaces and Classes in This Appendix A-82
Quick‐Check Exercises A-82
Review Questions A-82
Programming Projects A-83
Answer to Quick‐Check Exercises A-84
Appendix B Overview of UML A-85
B.1 The Class Diagram A-85
Representing Classes and Interfaces A-86
Generalization A-87
Inner or Nested Classes A-88
Aggregation and Composition A-88
B.2 Object Diagrams A-89
Glossary G-1
Index I-1