Menu Expand
Data Abstraction and Problem Solving with Java: Walls and Mirrors

Data Abstraction and Problem Solving with Java: Walls and Mirrors

Janet Prichard

(2014)

Additional Information

Book Details

Abstract

The Third Edition of Data Abstraction and Problem Solving with Java: Walls and Mirrors employs the analogies of Walls (data abstraction) and Mirrors (recursion) to teach Java programming design solutions, in a way that beginning students find accessible. The book has a student-friendly pedagogical approach that carefully accounts for the strengths and weaknesses of the Java language. With this book, students will gain a solid foundation in data abstraction, object-oriented programming, and other problem-solving techniques.

Table of Contents

Section Title Page Action Price
Cover Cover
Contents 7
Preface 15
Chapter Dependency Chart 18
PART ONE: Problem-Solving Techniques 25
1 Review of Java Fundamentals 27
1.1 Language Basics 28
Comments 28
Identifiers and Keywords 28
Variables 28
Primitive Data Types 29
References 30
Literal Constants 30
Named Constants 31
Assignments and Expressions 32
Arrays 35
1.2 Selection Statements 38
The if Statement 39
The switch Statement 40
1.3 Iteration Statements 41
The while Statement 41
The for Statement 42
The do Statement 45
1.4 Program Structure 45
Packages 46
Classes 47
Data Fields 48
Methods 50
How to Access Members of an Object 54
Class Inheritance 54
1.5 Useful Java Classes 56
The Object Class 56
The Array Class 58
String Classes 59
1.6 Java Exceptions 64
Catching Exceptions 64
Throwing Exceptions 71
1.7 Text Input and Output 73
Input 73
Output 75
The Console Class 78
1.8 File Input and Output 80
Text Files 82
Object Serialization 90
Summary 93
Cautions 96
Self-Test Exercises 96
Exercises 97
Programming Problems 102
2 Principles of Programming and Software Engineering 105
2.1 Problem Solving and Software Engineering 106
What Is Problem Solving? 106
The Life Cycle of Software 107
What Is a Good Solution? 117
2.2 Achieving an Object-Oriented Design 119
Abstraction and Information Hiding 120
Object-Oriented Design 122
Functional Decomposition 124
General Design Guidelines 125
Modeling Object-Oriented Designs Using UML 126
Advantages of an Object-Oriented Approach 130
2.3 A Summary of Key Issues in Programming 131
Modularity 131
Modifiability 133
Ease of Use 135
Fail-Safe Programming 136
Style 142
Debugging 146
Summary 149
Cautions 150
Self-Test Exercises 150
Exercises 151
Programming Problems 156
3 Recursion: The Mirrors 161
3.1 Recursive Solutions 162
A Recursive Valued Method: The Factorial of n 165
A Recursive void Method: Writing a String Backward 172
3.2 Counting Things 183
Multiplying Rabbits (The Fibonacci Sequence) 183
Organizing a Parade 185
Mr. Spock’s Dilemma (Choosing k out of n Things) 188
3.3 Searching an Array 190
Finding the Largest Item in an Array 191
Binary Search 192
Finding the kth Smallest Item in an Array 196
3.4 Organizing Data 200
The Towers of Hanoi 200
3.5 Recursion and Efficiency 204
Summary 211
Cautions 211
Self-Test Exercises 212
Exercises 213
Programming Problems 219
4 Data Abstraction: The Walls 221
4.1 Abstract Data Types 222
4.2 Specifying ADTs 227
The ADT List 228
The ADT Sorted List 233
Designing an ADT 235
Axioms (Optional) 239
4.3 Implementing ADTs 242
Java Classes Revisited 243
Java Interfaces 245
Java Packages 248
An Array-Based Implementation of the ADT List 250
Summary 257
Cautions 257
Self-Test Exercises 258
Exercises 259
Programming Problems 262
5 Linked Lists 265
5.1 Preliminaries 266
Object References 266
Resizeable Arrays 272
Reference-Based Linked Lists 273
5.2 Programming with Linked Lists 277
Displaying the Contents of a Linked List 277
Deleting a Specified Node from a Linked List 279
Inserting a Node into a Specified Position of a Linked List 282
A Reference-Based Implementation of the ADT List 288
Comparing Array-Based and Reference-Based Implementations 292
Passing a Linked List to a Method 295
Processing Linked Lists Recursively 295
5.3 Variations of the Linked List 301
Tail References 301
Circular Linked Lists 302
Dummy Head Nodes 304
Doubly Linked Lists 304
5.4 Application: Maintaining an Inventory 308
5.5 The Java Collections Framework 314
Generics 315
Iterators 316
The Java Collection’s Framework List Interface 319
Summary 322
Cautions 324
Self-Test Exercises 325
Exercises 327
Programming Problems 330
PART TWO: Problem Solving with Abstract Data Types 337
6 Recursion as a Problem-Solving Technique 339
6.1 Backtracking 340
The Eight Queens Problem 340
6.2 Defining Languages 345
The Basics of Grammars 346
Two Simple Languages 347
Algebraic Expressions 350
6.3 The Relationship Between Recursion and Mathematical Induction 360
The Correctness of the Recursive Factorial Method 360
The Cost of Towers of Hanoi 361
Summary 363
Cautions 363
Self-Test Exercises 364
Exercises 364
Programming Problems 368
7 Stacks 375
7.1 The Abstract Data Type Stack 376
Developing an ADT During the Design of a Solution 376
7.2 Simple Applications of the ADT Stack 382
Checking for Balanced Braces 382
Recognizing Strings in a Language 386
7.3 Implementations of the ADT Stack 387
An Array-Based Implementation of the ADT Stack 389
A Reference-Based Implementation of the ADT Stack 391
An Implementation That Uses the ADT List 393
Comparing Implementations 395
The Java Collections Framework Class Stack 395
7.4 Application: Algebraic Expressions 397
Evaluating Postfix Expressions 397
Converting Infix Expressions to Equivalent Postfix Expressions 399
7.5 Application: A Search Problem 402
A Nonrecursive Solution That Uses a Stack 404
A Recursive Solution 412
7.6 The Relationship Between Stacks and Recursion 415
Summary 417
Cautions 417
Self-Test Exercises 418
Exercises 419
Programming Problems 424
8 Queues 433
8.1 The Abstract Data Type Queue 434
8.2 Simple Applications of the ADT Queue 436
Reading a String of Characters 436
Recognizing Palindromes 437
8.3 Implementations of the ADT Queue 438
A Reference-Based Implementation 440
An Array-Based Implementation 443
An Implementation That Uses the ADT List 449
The JCF Interfaces Queue and Deque 450
Comparing Implementations 456
8.4 A Summary of Position-Oriented ADTs 457
8.5 Application: Simulation 458
Summary 468
Cautions 469
Self-Test Exercises 469
Exercises 470
Programming Problems 474
9 Advanced Java Topics 479
9.1 Inheritance Revisited 480
Java Access Modifiers 486
Is-a and Has-a Relationships 488
9.2 Dynamic Binding and Abstract Classes 490
Abstract Classes 493
Java Interfaces Revisited 498
9.3 Java Generics 499
Generic Classes 499
Generic Wildcards 501
Generic Classes and Inheritance 502
Generic Implementation of the Class List 505
Generic Methods 507
9.4 The ADTs List and Sorted List Revisited 508
Implementations of the ADT Sorted List That Use the ADT List 509
9.5 Iterators 513
Summary 517
Cautions 518
Self-Test Exercises 518
Exercises 519
Programming Problems 524
10 Algorithm Efficiency and Sorting 529
10.1 Measuring the Efficiency of Algorithms 530
The Execution Time of Algorithms 531
Algorithm Growth Rates 533
Order-of-Magnitude Analysis and Big O Notation 533
Keeping Your Perspective 539
The Efficiency of Searching Algorithms 541
10.2 Sorting Algorithms and Their Efficiency 542
Selection Sort 543
Bubble Sort 547
Insertion Sort 549
Mergesort 551
Quicksort 557
Radix Sort 569
A Comparison of Sorting Algorithms 571
The Java Collections Framework Sort Algorithm 572
Summary 576
Cautions 577
Self-Test Exercises 577
Exercises 578
Programming Problems 582
11 Trees 585
11.1 Terminology 586
11.2 The ADT Binary Tree 594
Basic Operations of the ADT Binary Tree 594
General Operations of the ADT Binary Tree 595
Traversals of a Binary Tree 598
Possible Representations of a Binary Tree 601
A Reference-Based Implementation of the ADT Binary Tree 605
Tree Traversals Using an Iterator 610
11.3 The ADT Binary Search Tree 618
Algorithms for the Operations of the ADT Binary Search Tree 624
A Reference-Based Implementation of the ADT Binary Search Tree 639
The Efficiency of Binary Search Tree Operations 643
Treesort 648
Saving a Binary Search Tree in a File 649
The JCF Binary Search Algorithm 652
11.4 General Trees 653
Summary 655
Cautions 656
Self-Test Exercises 656
Exercises 658
Programming Problems 664
12 Tables and Priority Queues 667
12.1 The ADT Table 668
Selecting an Implementation 675
A Sorted Array-Based Implementation of the ADT Table 682
A Binary Search Tree Implementation of the ADT Table 685
12.2 The ADT Priority Queue: A Variation of the ADT Table 687
Heaps 691
A Heap Implementation of the ADT Priority Queue 700
Heapsort 702
12.3 Tables and Priority Queues in the JCF 705
The JCF Map Interface 705
The JCF Set Interface 709
The JCF PriorityQueue Class 713
Summary 715
Cautions 716
Self-Test Exercises 716
Exercises 717
Programming Problems 720
13 Advanced Implementations of Tables 723
13.1 Balanced Search Trees 724
2-3 Trees 725
2-3-4 Trees 745
Red-Black Trees 752
AVL Trees 755
13.2 Hashing 761
Hash Functions 765
Resolving Collisions 767
The Efficiency of Hashing 776
What Constitutes a Good Hash Function? 779
Table Traversal: An Inefficient Operation under Hashing 781
The JCF Hashtable and TreeMap Classes 782
The Hashtable Class 782
The TreeMap Class 785
13.3 Data with Multiple Organizations 788
Summary 793
Cautions 794
Self-Test Exercises 795
Exercises 795
Programming Problems 798
14 Graphs 801
14.1 Terminology 802
14.2 Graphs as ADTs 805
Implementing Graphs 806
Implementing a Graph Class Using the JCF 809
14.3 Graph Traversals 812
Depth-First Search 814
Breadth-First Search 815
Implementing a BFS Iterator Class Using the JCF 817
14.4 Applications of Graphs 820
Topological Sorting 820
Spanning Trees 823
Minimum Spanning Trees 828
Shortest Paths 831
Circuits 835
Some Difficult Problems 838
Summary 839
Cautions 840
Self-Test Exercises 840
Exercises 841
Programming Problems 844
15 External Methods 847
15.1 A Look at External Storage 848
15.2 Sorting Data in an External File 851
15.3 External Tables 859
Indexing an External File 861
External Hashing 865
B-Trees 869
Traversals 879
Multiple Indexing 881
Summary 882
Cautions 883
Self-Test Exercises 883
Exercises 883
Programming Problems 886
A: A Comparison of Java to C 887
B: Unicode Character Codes (ASCII Subset) 891
C: Java Resources 892
Java Web Sites 892
Using Java SE 6 892
Integrated Development Environments (IDEs) 893
D: Mathematical Induction 894
Example 1 894
Example 2 895
Example 3 896
Example 4 897
Example 5 897
Self-Test Exercises 898
Exercises 898
Glossary 901
A 901
B 902
C 904
D 905
E 906
F 907
G 908
H 908
I 909
J 910
K 911
L 911
M 912
N 912
O 912
P 913
Q 914
R 915
S 916
T 918
U 919
V 919
W 919
Self-Test Answers 921
Index 945
Symbols 945
Numbers 945
A 945
B 947
C 948
D 949
E 949
F 950
G 950
H 951
I 951
J 952
K 953
L 953
M 954
N 954
O 954
P 955
Q 955
R 956
S 956
T 958
U 959
V 959
W 959
Z 959