Data Structures and Problem Solving with C++ Second Edition
Transcription
Data Structures and Problem Solving with C++ Second Edition
Data Structures and Problem Solving with C++ Second Edition Instructors Resource Manual Mark Allen Weiss Florida International University Addison-Wesley Publishing Company, Inc. Menlo Park, California • Reading, Massachusetts • New York • Don Mills, Ontario Wokingham, U.K. • Amsterdam • Bonn • Paris • Milan • Madrid • Sydney Singapore • Tokyo • Seoul • Tapei • Mexico City • San Juan, Puerto Rico Chapter 1 1.1 1.2 1.3 2.2 2.3 3.2 3.3 Objects and Classes 7 Key Concepts and How To Teach Them 7 2.1.1 The class Construct 7 2.1.2 Public and Private Sections 8 2.1.3 Interface vs. Implementation 8 2.1.4 Constructors, Destructors, Copy Constructor, and Copy Assignment operator= 8 2.1.5 const Member Functions 9 2.1.6 this Pointer 9 2.1.7 Operator Overloading 9 2.1.8 Type Conversions 10 2.1.9 I/O (Friends), and More on Binary Operators 10 2.1.10 static Class Members 10 2.1.11 enum, and Constant Class Members 10 2.1.12 string Class 10 Solutions To Exercises 11 Exam Questions 13 Chapter 3 3.1 1 Key Concepts and How To Teach Them 1 1.1.1 Arrays 1 1.1.2 Strings 1 1.1.3 Pointers 2 1.1.4 Dynamic Allocation 2 1.1.5 Reference Variables and Parameter Passing Mechanisms 2 1.1.6 Structures 2 Solutions To Exercises 3 Exam Questions 4 Chapter 2 2.1 Pointers, Arrays, and Structures Templates 19 Key Concepts and How To Teach Them 19 3.1.1 The Concept of a Template 19 3.1.2 Function Templates 19 3.1.3 Class Templates 20 3.1.4 vector Class 20 3.1.5 Fancy Stuff 20 3.1.6 Bugs 20 Solutions To Exercises 21 Exam Questions 22 Chapter 4 4.1 4.2 4.3 5.2 5.3 6.2 6.3 Algorithm Analysis 33 The Standard Template Library Key Concepts and How To Teach Them 43 Solutions To Exercises 44 Exam Questions 46 Chapter 8 8.1 31 Key Concepts and How To Teach Them 33 6.1.1 What is Algorithm Analysis 33 6.1.2 Some Examples 33 6.1.3 The Maximum Contiguous Subsequence Sum Problem 33 6.1.4 Official Big-oh Rules 34 6.1.5 Logarithms 34 Solutions To Exercises 34 Exam Questions 37 Chapter 7 7.1 7.2 7.3 Design Patterns Key Concepts and How To Teach Them 31 5.1.1 Must-Teach Patterns 31 Solutions To Exercises 31 Exam Questions 32 Chapter 6 6.1 25 Key Concepts and How To Teach Them 25 4.1.1 The Concept of Inheritance and Polymorphism 25 4.1.2 Public, Private, and Protected Members and Inheritance 26 4.1.3 Static vs. Dynamic Binding 26 4.1.4 Default Constructor, Copy Constructor, and Copy Assignment Operator 26 4.1.5 Abstract Classes 27 4.1.6 Tricky Details 27 Solutions To Exercises 27 Exam Questions 28 Chapter 5 5.1 Inheritance Recursion 49 Key Concepts and How To Teach Them 49 8.1.1 What is Recursion? 49 8.1.2 Proof by Induction 49 8.1.3 Basic Recursion 50 43 8.2 8.3 8.1.4 Numerical Applications 50 8.1.5 Divide and Conquer 50 8.1.6 Dynamic Programming and Backtracking 50 Solutions To Exercises 51 Exam Questions 54 Chapter 9 9.1 9.2 9.3 10.2 10.3 11.2 11.3 67 Fun and Games 71 Key Concepts and How To Teach Them 71 11.1.1 Word Search Puzzle 71 11.1.2 Tic-tac-toe 71 Solutions To Exercises 72 Exam Questions 73 Chapter 12 12.1 Randomization Key Concepts and How To Teach Them 67 10.1.1 Linear Congruential Generators 67 10.1.2 Permutation Generation 67 10.1.3 Randomized Algorithms 68 Solutions To Exercises 68 Exam Questions 69 Chapter 11 11.1 59 Key Concepts and How To Teach Them 59 9.1.1 Motivation for Sorting 59 9.1.2 Insertion Sort Analysis 60 9.1.3 Shellsort 60 9.1.4 Mergesort 60 9.1.5 Quicksort 60 9.1.6 Selection 60 9.1.7 Lower Bound for Sorting 60 9.1.8 Indirect sorting 61 Solutions To Exercises 61 Exam Questions 64 Chapter 10 10.1 Sorting Stacks and Compilers 75 Key Concepts and How To Teach Them 75 12.1.1 Balanced Symbol Checker 75 12.1.2 Infix to Postfix Conversion 75 12.2 12.3 Solutions To Exercises 76 Exam Questions 79 Chapter 13 13.1 13.2 13.3 14.2 14.3 15.2 15.3 16.2 16.3 85 Graphs and Paths 89 Key Concepts and How To Teach Them 89 15.1.1 Definitions and Implementation 89 15.1.2 Unweighted Shortest Paths 90 15.1.3 Positive Weighted Shortest Paths 90 15.1.4 Negative Weighted Shortest Paths 90 15.1.5 Acyclic Graphs 90 Solutions To Exercises 91 Exam Questions 93 Chapter 16 16.1 Simulation Key Concepts and How To Teach Them 85 14.1.1 Josephus Problem 85 14.1.2 Discrete-event Simulation 85 Solutions To Exercises 86 Exam Questions 87 Chapter 15 15.1 81 Key Concepts and How To Teach Them 81 13.1.1 Huffman’s Algorithm 81 13.1.2 Cross-reference Generator 81 Solutions To Exercises 82 Exam Questions 83 Chapter 14 14.1 Utilities Stacks and Queues 97 Key Concepts and How To Teach Them 97 16.1.1 Array-based Stack 97 16.1.2 Array-based Queue 97 16.1.3 Linked list-based Stack 97 16.1.4 Linked list-based Queue 98 16.1.5 Double-ended Queue 98 Solutions To Exercises 98 Exam Questions 100 Chapter 17 17.1 17.2 17.3 18.2 18.3 19.2 19.3 20.2 20.3 109 Binary Search Trees 117 Key Concepts and How To Teach Them 117 19.1.1 The Basic Binary Search Tree 117 19.1.2 Order Statistics 118 19.1.3 AVL Trees, Red-Black Trees, and AA-trees 118 19.1.4 STL set and map 118 19.1.5 B-trees 118 Solutions To Exercises 118 Exam Questions 123 Chapter 20 20.1 Trees Key Concepts and How To Teach Them 109 18.1.1 General Trees and Recursion 109 18.1.2 Binary Trees and Recursion 109 18.1.3 Tree Traversal 110 Solutions To Exercises 110 Exam Questions 113 Chapter 19 19.1 103 Key Concepts and How To Teach Them 103 17.1.1 Basic Ideas: Header Nodes and Iterator Classes 103 17.1.2 Implementation Details 103 17.1.3 Doubly Linked Lists and Circular Linked Lists 104 17.1.4 Sorted Linked Lists 104 17.1.5 The STL list Implementation 104 Solutions To Exercises 104 Exam Questions 106 Chapter 18 18.1 Linked Lists Hash Tables 127 Key Concepts and How To Teach Them 127 20.1.1 Basic Ideas 127 20.1.2 Hash Function 127 20.1.3 Linear Probing 127 20.1.4 Quadratic Probing 128 20.1.5 Other Implementations 128 Solutions To Exercises 128 Exam Questions 131 Chapter 21 21.1 21.2 21.3 Key Concepts and How To Teach Them 135 21.1.1 Binary Heap and Heapsort 135 Solutions To Exercises 136 Exam Questions 139 Chapter 22 22.1 22.2 22.3 143 Merging Priority Queues 147 Key Concepts and How To Teach Them 147 Solutions To Exercises 147 Exam Questions 149 Chapter 24 24.1 24.2 24.3 Splay Trees Key Concepts and How To Teach Them 143 Solutions To Exercises 143 Exam Questions 144 Chapter 23 23.1 23.2 23.3 A Priority Queue: The Binary Heap The Disjoint Set Class 151 Key Concepts and How To Teach Them 151 Solutions To Exercises 151 Exam Questions 154 APPENDIX 157 Appendix A Sample Syllabi 159 Appendix B Sample Assignments 163 135 Preface This Instructor’s Resource Manual provides additional material for instructors to use in conjunction with Data Structures, and Problem Solving with C++, second edition. Each chapter in the text has a corresponding chapter in this manual that consists of: • A section on the important concepts and how to teach them • Solutions to many of the In Short and In Theory questions, as well as some comments for some of the In Practice questions • Multiple choice questions I have attempted to avoid redundancy. As a result, common errors, which are already listed in the text for each chapter, are not repeated. You should be sure to review these errors with your students. Also, I have not repeated material already stated in the book’s preface. A minimal set of multiple choice questions is provided. It is easy to generate additional questions from both these multiple choice questions (for example, replace inorder with postorder, and you have a different question in Chapter 18) and from some of the in chapter exercises. It is also a simple matter to design true/ false questions or fill in questions based on what is provided. My own preference is to give three types of questions on an exam: long answer (write a code fragment...), simulation (show the data structure after the following operations...), and questions. Of course if you have very large sections, grading this might be too time consuming. As mentioned in the textbook, the source code is available online. I have not included any additional directly compilable code in this supplement. Appendix A provides two syllabii: One for the separation approach, and one for the traditional approach. Eight assignments are described in Appendix B. Many many more are sugested as Programming Projects throughout the text. E-mail Please send comments and error reports to weiss@fiu.edu. Eventually, my home page http://www.fiu.edu/~weiss will maintain an updated error list and additional notes. Chapter 1 Pointers, Arrays, and Structures 1.1 Key Concepts and How To Teach Them This chapter introduces several concepts: • • • • • • basic arrays (first-class arrays, using vector) basic strings (using string) pointers dynamic allocation reference variables and parameter passing mechanisms structures Depending on the students’ background, some or even all of this chapter could be skipped, but I recommend at least a quick review of the chapter in all circumstances. Students who have not had C or C++ should go through the entire chapter slowly. It is easy for students to think they understand the material in this chapter based on an earlier course, and my experience is that they do not. 1.1.1 Arrays Modern C++ arrays use the standard vector class and avoids the C-style array. I like to explain the idea of using a library class, so as to lead in to Chapter 2. Remind students that array indexing starts at 0 and goes to size()-1. Off-byone errors are very common; make sure the students are aware of these possibilities, and that the standard vector is not bounds checked (we write a better one in Chapter 3). Explain parameter passing. Finally discuss the push_back idea. I have found that push_back is easy for students to understand. 1.1.2 Strings There is not much to do here; avoid C-style strings. You may prefer to do strings before arrays. 1.1.3 Pointers Draw the usual memory pictures and emphasize that a pointer object is an object that stores a memory address. Go through as many examples as you can to distinguish between accessing a pointer and dereferencing it. Note: The NULL constant is defined in several header files, including stdlib.h. 1.1.4 Dynamic Allocation This is here to avoid forward references in the text. You may prefer to delay this material until linked lists are discussed. Or you can preview the idea of new and delete, and explain the problems of stale pointers and double-deletion. Explain the term memory leak. 1.1.5 Reference Variables and Parameter Passing Mechanisms The key topic here is the distinction between call-by-value, call-by-reference, and call-by-constant reference. Emphasize over and over again, that there are really three forms of parameter passing and that the const is not merely window dressing. Here are my rules: • Call by value: used for IN parameters for built-in types • Call by constant reference: used for IN parameters for class types • Call by reference: used for IN OUT parameters Many students insists on passing int objects by constant reference; this is wrong! It induces the overhead of pointer indirection when the reference is accessed inside the function. Many students get confused about passing pointers. When a pointer object is passed, the value of the object is an address. Passing a pointer by reference means that where the pointer points at could change. This is useful for resizing dynamically allocated C-style arrays and also in binary tree updates. 1.1.6 Structures This is a quickie opener to the class discussion. A C-style structure achieves the grouping of data, but does not provide for information hiding or encapsulation of functionality. Even so, some issues become evident and are worth discussing: 1. Structures should be passed either by reference or constant reference. 2. Deep vs. shallow copy. 3. Quick introduction to the linked list, C-style. 1.2 Solutions To Exercises In Short 1.1 1.2 1.3 1.4 1.5 1.6 Pointers can be declared and initialized, they can be assigned to point at an object, they can be dereferenced, they can be involved in arithmetic. The address-of operator can be applied to a pointer in the same manner as any other object. (a) Yes; (b) Both have the same value as A; (c) *ptrPtr=&b; (d) No; these objects have different types. (a) Yes as long as x is an object. (b) No, because x might not be a pointer. (a) the address where a is stored; (b) the value of a (5); (c) 1; (d) this is a type mismatch, and if accepted by the compiler is most likely 0; (e) the address where ptr is stored; (f) illegal, because a is not a pointer; (g) the value of a (5); (h) the value of a (5). (a) a is a member of type int in struct S and b is a member of type pointer to S in struct S; (b) z is of type S; (c) x is of type pointer to S; (d) y is of type array of 10 S; (e) u is of type array of 10 pointer to S; (f) x>a is of type int; (g) x->b is of type pointer to S; (h) z.b is of type pointer to S; (i) z.a is of type int; (j) *z.a is illegal because z.a is not a pointer type; (k) (*z).a is illegal because z is not a pointer type; (l) (this question should not be here) x->b-z.b is a subtraction of pointers and is thus of type int; (m) y->a is illegal; (n) y[1] is of type S; (o) y[1].a is of type int; (p) y[1].b is of type pointer to S; (q) u[2] is of type pointer to S; (r) *u[2] is of type S; (s) u[2]->a is of type int; (t) u[2]->b is of type pointer to S; (u) u[10] is of type pointer to S but is past the declared bounds of u; (v) &z is of type pointer to S; (w) &x is of type pointer to pointer to S; (x) u is of type array of pointer to S; (y) y is of type array of S. The picture below reflects a, b, and c after the declarations. The statement b=5 changes a to 5 and then c=2 changes a to 2. b a = 3 c 1.7 1.8 1.3 1.1. This is perfectly legal. However if the const is moved from the second declaration to the first, then the declaration and initialization of b would be illegal. /* begins a comment. Exam Questions For the declarations below, which statement is illegal? int *ptr1; int *ptr2; int a = 5; a. b. c. d. e. 1.2. ptr1 = ptr2; ptr1 = a; ptr1 = &a; *ptr1 = *ptr2; *ptr1 = a; For the declarations below, which expression is true if ptr1 and ptr2 point at the same object? int *ptr1; int *ptr2; a. b. c. d. e. 1.3. ptr1 == ptr2 *ptr1 == *ptr2 *(ptr1 == *ptr2) &ptr1 == &ptr2 None of the above For the declaration below, what is the type of *a? const int *a; a. b. c. d. e. int const int int * const int * none of the above 1.4. Call by value Call by reference Call by constant reference All of the above None of the above A shallow copy refers to a. b. c. d. e. 1.7. A local array is deleted. A dynamically allocated object is deleted. A dynamically allocated object is no longer referenced. Two pointers point at the same object. A dynamically allocated object is deleted twice. Which of the following parameter passing mechanisms can be used to alter a parameter? a. b. c. d. e. 1.6. A memory leak occurs when: a. b. c. d. e. 1.5. the copying of small objects the copying of pointers the copying of objects that are being pointed at the copying of basic types, such as integers call by value Exogenous data is a. a small member of a structure b. a large member of a structure c. an object that is not part of the structure, but is pointed at by the structure d. a global variable e. the entire structure 1.8. If f is a member of structure S, and p is of type pointer to S, then which expression must be legal? a. b. c. d. e. p.f p->f *p.f s.f More than one of the above 1.9. What is the result of the following? int x = 5; int & ref = x; ref++; a. b. c. d. e. 1.10. It increments x It increments ref It increments *ref It increments &ref It is illegal What is the result of the following? int x = 5; int *ptr = &x; int * & ref = ptr; *ref++; a. b. c. d. e. It increments ptr It increments ref It increments x It increments &ref It is illegal Answers to Exam Questions 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. B A B C B B C B A A