Chapter 15: Advanced Topics: Introducing Data Structures and Recursion Visual Basic .NET Programming: From Problem Analysis to Program Design Objectives • Create linked lists • Create a stack • Create a queue • Understand recursion • Write recursive methods Visual Basic .NET Programming: From Problem Analysis to Program Design 2 Introducing Data Structures • Linked list – List of object instances that are linked together – Objects may be added to: • Beginning • End • Somewhere in between Visual Basic .NET Programming: From Problem Analysis to Program Design 3 Visual Basic .NET Programming: From Problem Analysis to Program Design 4 Introducing Data Structures (continued) • Stack – Can be implemented as specialized case of linked list – Objects are added and removed only at beginning of list – Employs LIFO logic • Last in, first out Visual Basic .NET Programming: From Problem Analysis to Program Design 5 Visual Basic .NET Programming: From Problem Analysis to Program Design 6 Introducing Data Structures (continued) • Queue – Implemented as linked list – Objects added at end and removed from beginning – Employ FIFO logic • First in, first out Visual Basic .NET Programming: From Problem Analysis to Program Design 7 Visual Basic .NET Programming: From Problem Analysis to Program Design 8 Creating Linked Lists • Node – Each instance in linked list contains • Data • Reference attribute linking it to next node • Maintain references to first and last item in list – To facilitate access Visual Basic .NET Programming: From Problem Analysis to Program Design 9 Creating Linked Lists (continued) • Self-referencing class – Class that references instances of itself Visual Basic .NET Programming: From Problem Analysis to Program Design 10 Visual Basic .NET Programming: From Problem Analysis to Program Design 11 Visual Basic .NET Programming: From Problem Analysis to Program Design 12 Visual Basic .NET Programming: From Problem Analysis to Program Design 13 Visual Basic .NET Programming: From Problem Analysis to Program Design 14 Creating a Stack • Stack can be implemented as LinkedList – LIFO structure: • Add and remove nodes from only beginning of Stack – Employ inheritance to create Stack class • As subclass of LinkedList Visual Basic .NET Programming: From Problem Analysis to Program Design 15 Visual Basic .NET Programming: From Problem Analysis to Program Design 16 Exploring the FCL Stack Class • Stores nodes as instances of Object • Methods: – Push – Pop – Peek – ToArray Visual Basic .NET Programming: From Problem Analysis to Program Design 17 Creating a Queue • Queue can be implemented as linked list • Objects added only at end • Removed only from beginning – Employing FIFO logic • Enqueue – Add object • Dequeue – Remove object Visual Basic .NET Programming: From Problem Analysis to Program Design 18 Visual Basic .NET Programming: From Problem Analysis to Program Design 19 Creating a Queue (continued) • Placing common attributes and methods in superclass eliminates redundancy in subclasses – Count and IsEmpty added to superclass Visual Basic .NET Programming: From Problem Analysis to Program Design 20 Exploring the FCL Queue class • Queue class – Stores nodes as instances of Object • Methods: – Enqueue – Dequeue – Peek – ToArray Visual Basic .NET Programming: From Problem Analysis to Program Design 21 Programming Example: Reservation Application • Implements reservation system • Reservation class methods: – MakeReservation – CancelReservation – ListReservations Visual Basic .NET Programming: From Problem Analysis to Program Design 22 Visual Basic .NET Programming: From Problem Analysis to Program Design 23 Understanding Recursion • • • Programming technique in which method calls itself For some problems recursive approach leads to simple and elegant solution Recursive problem-solving approach – Divides complex problem into successively smaller but similar subproblems – Solves each subproblem – Assembles result Visual Basic .NET Programming: From Problem Analysis to Program Design 24 Example 15-8: Using a Recursive Method to Simulate Opening Boxes Module OpenBoxesRecursively Sub Main() 'open largest box (size 10) OpenBox(10) System.Console.WriteLine(”Done”) End Sub Visual Basic .NET Programming: From Problem Analysis to Program Design 25 Example 15-8: Using a Recursive Method to Simulate Opening Boxes (continued) Sub OpenBox(ByVal boxSize As Integer) If boxSize = 0 Then System.Console.WriteLine(”No more boxes”) Else System.Console.WriteLine(”Box “ & boxSize & _ “ opened”) OpenBox(boxSize - 1) End If Visual Basic .NET Programming: From Problem Analysis to Program Design 26 Visual Basic .NET Programming: From Problem Analysis to Program Design 27 (Continued) Visual Basic .NET Programming: From Problem Analysis to Program Design 28 Example 15-8: Using a Recursive Method to Simulate Opening Boxes (continued) • Recursive algorithm must have stopping point – Called base case – When encountered, recursion stops Visual Basic .NET Programming: From Problem Analysis to Program Design 29 Example 15-8: Using a Recursive Method to Simulate Opening Boxes (continued) • Each time recursive method calls itself – Fresh copy of the method created – Each copy has own set of values and parameters – Remains unfinished until base case is recognized Visual Basic .NET Programming: From Problem Analysis to Program Design 30 Example 15-8: Using a Recursive Method to Simulate Opening Boxes (continued) • Upon each return – Execution resumes within that copy at line of code immediately following recursive call • Recursion is similar to iteration – Any problem that can be solved iteratively can also be solved recursively, and vice versa – Recursive solutions are less efficient Visual Basic .NET Programming: From Problem Analysis to Program Design 31 Writing Recursive Methods • Write recursive method: – Must think recursively – Think of problem in terms of series of successively smaller but virtually identical subproblems – Smallest subproblem must be one that can be solved directly Visual Basic .NET Programming: From Problem Analysis to Program Design 32 Computing Factorials • Classic example of recursion involves computing factorials • Definition: – n! = n * (n – 1) * (n – 2) * . . . * 1, where n is a positive integer – 0! = 1 • Thinking recursively: – 4! can be defined as 4 * 3! Visual Basic .NET Programming: From Problem Analysis to Program Design 33 Computing Factorials (continued) • Calculating factorials can produce a number that is too large to be represented in memory space allocated to a particular variable – 12! is largest factorial that can be computed using Integer data type to hold result Visual Basic .NET Programming: From Problem Analysis to Program Design 34 Visual Basic .NET Programming: From Problem Analysis to Program Design 35 Visual Basic .NET Programming: From Problem Analysis to Program Design 36 Visual Basic .NET Programming: From Problem Analysis to Program Design 37 (Continued) Visual Basic .NET Programming: From Problem Analysis to Program Design 38 Displaying a Directory Tree • Generate and display tree containing directories and subdirectories on hard drive • Depending on size of your hard drive and speed of your computer – Initially creating directory tree may take a few minutes Visual Basic .NET Programming: From Problem Analysis to Program Design 39 Visual Basic .NET Programming: From Problem Analysis to Program Design 40 Sorting an Array • Recursive methods are frequently used for array processing • Quicksort – Recursive technique for sorting one-dimensional array – Begins by selecting array element to serve as pivot Visual Basic .NET Programming: From Problem Analysis to Program Design 41 Sorting an Array (continued) • Quicksort (continued) – Position pivot such that • All array elements to right are greater than or equal to pivot • All array elements to left are less than or equal to pivot – Elements to right and left of pivot form subarrays • Sort them using Quicksort Visual Basic .NET Programming: From Problem Analysis to Program Design 42 Programming Example: Towers of Hanoi • Classic computer science problem • Priests in Far Eastern temple were given task of moving stack of 64 disks from one pole to another • Each disk was slightly different size – Disks were arranged on pole from top to bottom in order of increasing size – Intermediate pole also available to hold disks Visual Basic .NET Programming: From Problem Analysis to Program Design 43 Programming Example: Towers of Hanoi (continued) • Priests were to move all 64 disks to third pole using the following rules: – Only one disk can be moved at a time – Removed disk must be placed on one of other poles – Under no circumstance may larger disk be placed upon smaller disk • Priests were told that world would end when they completed their task Visual Basic .NET Programming: From Problem Analysis to Program Design 44 Visual Basic .NET Programming: From Problem Analysis to Program Design 45 Visual Basic .NET Programming: From Problem Analysis to Program Design 46 Programming Example: Towers of Hanoi (continued) • Recursive algorithm: – Move top n-1 disks from pole 1 to pole 2, using pole 3 to temporarily hold disks – Move bottom (nth) disk from pole 1 to pole 3 – Move n-1 disks on pole 2 to pole 3, using pole 1 to temporarily hold disks • Number of moves required to move the disks is 264-1 Visual Basic .NET Programming: From Problem Analysis to Program Design 47 Summary • Linked list – List of object instances that are linked together – Each instance is called a node • Stack – Can be implemented as special form of LinkedList – LIFO structure – FCL provides Stack class Visual Basic .NET Programming: From Problem Analysis to Program Design 48 Summary (continued) • Queue – Implemented as linked list with objects added at end and removed from beginning – Employ FIFO logic – FCL includes Queue class • Recursive problem-solving approach – Divides problem into series of smaller problems – Solves each subproblem – Assembles result Visual Basic .NET Programming: From Problem Analysis to Program Design 49