Presentation is loading. Please wait.

Presentation is loading. Please wait.

CSC212 Data Structure - Section AB

Similar presentations


Presentation on theme: "CSC212 Data Structure - Section AB"— Presentation transcript:

1 CSC212 Data Structure - Section AB
Lecture 12 Stacks and Queues Instructor: Edgardo Molina Department of Computer Science City College of New York This lecture was modified from the 1997 presentation with the textbook, with new conventions provided in the second edition (2001) of the textbook - Z. Zhu

2 Topics Stacks (Chapter 7) Queues (Chapter 8, Section1 - 3)
Priority Queues (Chapter 8, Section 4) References Return Values (Chapter 8, Section 5)

3 Stacks and the STL stack
Definition A stack is a data structure of ordered entries such that entries can be inserted and removed at only one end (call the top) LIFO A stack is a Last-In/First-Out data structure. Entries are taken out of the stack in the reverse order of their insertion Think about a stack of coins, books or pancakes – you put each book at the top, and can only remove the book from the top A better example is a Pez dispenser, which stores candy in a slot underneath an animal head figurine. Candy is loaded in the dispenser by pushing each piece into the hole. There is a spring under the candy with the tension adjusted so that when the animal head is tipped backward, one piece of candy is popped out. Last-In/First-Out is abbreviated as LIFO. An example: (p 341) – Using a stack to reverse spelling If the program read in Chad, then it will output dahC Draw it on backboard C push in : CHAD pop out :

4 Stacks and the STL stack
Definition A stack is a data structure of ordered entries such that entries can be inserted and removed at only one end (call the top) LIFO A stack is a Last-In/First-Out data structure. Entries are taken out of the stack in the reverse order of their insertion Think about a stack of coins, books or pancakes – you put each book at the top, and can only remove the book from the top A better example is a Pez dispenser, which stores candy in a slot underneath an animal head figurine. Candy is loaded in the dispenser by pushing each piece into the hole. There is a spring under the candy with the tension adjusted so that when the animal head is tipped backward, one piece of candy is popped out. Last-In/First-Out is abbreviated as LIFO. An example: (p 341) – Using a stack to reverse spelling If the program read in Chad, then it will output dahC Draw it on backboard CH push in : CHAD pop out :

5 Stacks and the STL stack
Definition A stack is a data structure of ordered entries such that entries can be inserted and removed at only one end (call the top) LIFO A stack is a Last-In/First-Out data structure. Entries are taken out of the stack in the reverse order of their insertion Think about a stack of coins, books or pancakes – you put each book at the top, and can only remove the book from the top A better example is a Pez dispenser, which stores candy in a slot underneath an animal head figurine. Candy is loaded in the dispenser by pushing each piece into the hole. There is a spring under the candy with the tension adjusted so that when the animal head is tipped backward, one piece of candy is popped out. Last-In/First-Out is abbreviated as LIFO. An example: (p 341) – Using a stack to reverse spelling If the program read in Chad, then it will output dahC Draw it on backboard CHA push in : CHAD pop out :

6 Stacks and the STL stack
Definition A stack is a data structure of ordered entries such that entries can be inserted and removed at only one end (call the top) LIFO A stack is a Last-In/First-Out data structure. Entries are taken out of the stack in the reverse order of their insertion Think about a stack of coins, books or pancakes – you put each book at the top, and can only remove the book from the top A better example is a Pez dispenser, which stores candy in a slot underneath an animal head figurine. Candy is loaded in the dispenser by pushing each piece into the hole. There is a spring under the candy with the tension adjusted so that when the animal head is tipped backward, one piece of candy is popped out. Last-In/First-Out is abbreviated as LIFO. An example: (p 341) – Using a stack to reverse spelling If the program read in Chad, then it will output dahC Draw it on backboard CHAD push in : CHAD pop out :

7 Stacks and the STL stack
Definition A stack is a data structure of ordered entries such that entries can be inserted and removed at only one end (call the top) LIFO A stack is a Last-In/First-Out data structure. Entries are taken out of the stack in the reverse order of their insertion Think about a stack of coins, books or pancakes – you put each book at the top, and can only remove the book from the top A better example is a Pez dispenser, which stores candy in a slot underneath an animal head figurine. Candy is loaded in the dispenser by pushing each piece into the hole. There is a spring under the candy with the tension adjusted so that when the animal head is tipped backward, one piece of candy is popped out. Last-In/First-Out is abbreviated as LIFO. An example: (p 341) – Using a stack to reverse spelling If the program read in Chad, then it will output dahC Draw it on backboard CHA push in : CHAD pop out :D

8 Stacks and the STL stack
Definition A stack is a data structure of ordered entries such that entries can be inserted and removed at only one end (call the top) LIFO A stack is a Last-In/First-Out data structure. Entries are taken out of the stack in the reverse order of their insertion Think about a stack of coins, books or pancakes – you put each book at the top, and can only remove the book from the top A better example is a Pez dispenser, which stores candy in a slot underneath an animal head figurine. Candy is loaded in the dispenser by pushing each piece into the hole. There is a spring under the candy with the tension adjusted so that when the animal head is tipped backward, one piece of candy is popped out. Last-In/First-Out is abbreviated as LIFO. An example: (p 341) – Using a stack to reverse spelling If the program read in Chad, then it will output dahC Draw it on backboard CH push in : CHAD pop out :DA

9 Stacks and the STL stack
Definition A stack is a data structure of ordered entries such that entries can be inserted and removed at only one end (call the top) LIFO A stack is a Last-In/First-Out data structure. Entries are taken out of the stack in the reverse order of their insertion Think about a stack of coins, books or pancakes – you put each book at the top, and can only remove the book from the top A better example is a Pez dispenser, which stores candy in a slot underneath an animal head figurine. Candy is loaded in the dispenser by pushing each piece into the hole. There is a spring under the candy with the tension adjusted so that when the animal head is tipped backward, one piece of candy is popped out. Last-In/First-Out is abbreviated as LIFO. An example: (p 341) – Using a stack to reverse spelling If the program read in Chad, then it will output dahC Draw it on backboard C push in : CHAD pop out : DAH

10 Stacks and the STL stack
Definition A stack is a data structure of ordered entries such that entries can be inserted and removed at only one end (call the top) LIFO A stack is a Last-In/First-Out data structure. Entries are taken out of the stack in the reverse order of their insertion Think about a stack of coins, books or pancakes – you put each book at the top, and can only remove the book from the top A better example is a Pez dispenser, which stores candy in a slot underneath an animal head figurine. Candy is loaded in the dispenser by pushing each piece into the hole. There is a spring under the candy with the tension adjusted so that when the animal head is tipped backward, one piece of candy is popped out. Last-In/First-Out is abbreviated as LIFO. An example: (p 341) – Using a stack to reverse spelling If the program read in Chad, then it will output dahC Draw it on backboard push in : CHAD pop out : DAHC

11 Stacks and the STL stack
The STL stack class a container class – holding many items a template class – stack of integers, strings, ... How to use #include <stack> stack<int> s1; Implementing it ourselves! (stack code) fixed-size or dynamic array, or linked list? STL typically uses dynamic array Functions: push, pop, empty, size , top Show students the code – it;’s turn out the code is very simple! Two implementations: fixed size array and listed list Why not dynamic array? – resize is expensive. Fixed size array is the most time efficient one – system can define a big stack Linked list is space efficient Five functions

12 Queues and the STL queue
Definition A queue is a data structure of ordered entries such that entries can only be inserted at one end (call the rear) and removed at the other end (call the front) – and the entry at the front of the queue is called the first entry FIFO A queue is a First-In/First-Out data structure. Entries are taken out of the queue in the same order that they were put into the queue Every time you get in line at a supermarket or in a cafeteria or in a bank or at a ticket window, you are adding yourself to a queue. If everybody is polite, then people add themselves to the rear of the queue, and the person at the front of the queue is served first. First-In/First-Out is abbreviated as FIFO. An example: (p 378) – Using a stack to reverse spelling, but using a queue in the same order If the program read in Chad, then it will output Chad Draw it on backboard DAHC put in : CHAD take out : CHAD

13 Queues and the STL queue
Definition A queue is a data structure of ordered entries such that entries can only be inserted at one end (call the rear) and removed at the other end (call the front) – and the entry at the front of the queue is called the first entry FIFO A queue is a First-In/First-Out data structure. Entries are taken out of the queue in the same order that they were put into the queue Every time you get in line at a supermarket or in a cafeteria or in a bank or at a ticket window, you are adding yourself to a queue. If everybody is polite, then people add themselves to the rear of the queue, and the person at the front of the queue is served first. First-In/First-Out is abbreviated as FIFO. An example: (p 378) – Using a stack to reverse spelling, but using a queue in the same order If the program read in Chad, then it will output Chad Draw it on backboard DAHC put in : CHAD take out : CHAD

14 Queues and the STL queue
Definition A queue is a data structure of ordered entries such that entries can only be inserted at one end (call the rear) and removed at the other end (call the front) – and the entry at the front of the queue is called the first entry FIFO A queue is a First-In/First-Out data structure. Entries are taken out of the queue in the same order that they were put into the queue Every time you get in line at a supermarket or in a cafeteria or in a bank or at a ticket window, you are adding yourself to a queue. If everybody is polite, then people add themselves to the rear of the queue, and the person at the front of the queue is served first. First-In/First-Out is abbreviated as FIFO. An example: (p 378) – Using a stack to reverse spelling, but using a queue in the same order If the program read in Chad, then it will output Chad Draw it on backboard DAHC put in : CHAD take out : CHAD

15 Queues and the STL queue
Definition A queue is a data structure of ordered entries such that entries can only be inserted at one end (call the rear) and removed at the other end (call the front) – and the entry at the front of the queue is called the first entry FIFO A queue is a First-In/First-Out data structure. Entries are taken out of the queue in the same order that they were put into the queue Every time you get in line at a supermarket or in a cafeteria or in a bank or at a ticket window, you are adding yourself to a queue. If everybody is polite, then people add themselves to the rear of the queue, and the person at the front of the queue is served first. First-In/First-Out is abbreviated as FIFO. An example: (p 378) – Using a stack to reverse spelling, but using a queue in the same order If the program read in Chad, then it will output Chad Draw it on backboard DAHC put in : CHAD take out : CHAD

16 Queues and the STL queue
Definition A queue is a data structure of ordered entries such that entries can only be inserted at one end (call the rear) and removed at the other end (call the front) – and the entry at the front of the queue is called the first entry FIFO A queue is a First-In/First-Out data structure. Entries are taken out of the queue in the same order that they were put into the queue Every time you get in line at a supermarket or in a cafeteria or in a bank or at a ticket window, you are adding yourself to a queue. If everybody is polite, then people add themselves to the rear of the queue, and the person at the front of the queue is served first. First-In/First-Out is abbreviated as FIFO. An example: (p 378) – Using a stack to reverse spelling, but using a queue in the same order If the program read in Chad, then it will output Chad Draw it on backboard DAHC put in : CHAD take out : CHAD

17 Queues and the STL queue
Definition A queue is a data structure of ordered entries such that entries can only be inserted at one end (call the rear) and removed at the other end (call the front) – and the entry at the front of the queue is called the first entry FIFO A queue is a First-In/First-Out data structure. Entries are taken out of the queue in the same order that they were put into the queue Every time you get in line at a supermarket or in a cafeteria or in a bank or at a ticket window, you are adding yourself to a queue. If everybody is polite, then people add themselves to the rear of the queue, and the person at the front of the queue is served first. First-In/First-Out is abbreviated as FIFO. An example: (p 378) – Using a stack to reverse spelling, but using a queue in the same order If the program read in Chad, then it will output Chad Draw it on backboard DAHC put in : CHAD take out : CHAD

18 Queues and the STL queue
Definition A queue is a data structure of ordered entries such that entries can only be inserted at one end (call the rear) and removed at the other end (call the front) – and the entry at the front of the queue is called the first entry FIFO A queue is a First-In/First-Out data structure. Entries are taken out of the queue in the same order that they were put into the queue Every time you get in line at a supermarket or in a cafeteria or in a bank or at a ticket window, you are adding yourself to a queue. If everybody is polite, then people add themselves to the rear of the queue, and the person at the front of the queue is served first. First-In/First-Out is abbreviated as FIFO. An example: (p 378) – Using a stack to reverse spelling, but using a queue in the same order If the program read in Chad, then it will output Chad Draw it on backboard DAHC put in : CHAD take out : CHAD

19 Queues and the STL queue
Definition A queue is a data structure of ordered entries such that entries can only be inserted at one end (call the rear) and removed at the other end (call the front) – and the entry at the front of the queue is called the first entry FIFO A queue is a First-In/First-Out data structure. Entries are taken out of the queue in the same order that they were put into the queue Every time you get in line at a supermarket or in a cafeteria or in a bank or at a ticket window, you are adding yourself to a queue. If everybody is polite, then people add themselves to the rear of the queue, and the person at the front of the queue is served first. First-In/First-Out is abbreviated as FIFO. An example: (p 378) – Using a stack to reverse spelling, but using a queue in the same order If the program read in Chad, then it will output Chad Draw it on backboard DAHC put in : CHAD take out : CHAD

20 Queues and the STL queue
The STL queue class a container class – holding many items a template class – queue of integers, strings, ... How to use #include <queue> queue<char> q1; Implementing it ourselves! (queue code) fixed-size or dynamic array, or linked list? STL typically uses dynamic array Functions: push, pop, empty, size, front Show students the code – it;’s turn out the code is very simple! Two implementations: fixed size array and listed list Why not dynamic array? – resize is expensive. Fixed size array is the most time efficient one – system can define a big stack Linked list is space efficient Five functions Queue with fixed size array - circular array - next_item function (private memeber function)

21 Priority Queues A priority queue is a container class that allows entries to be retrieved according to some specified priority levels. The highest priority entry is removed first Entries with equal priority can be removed according some criterion e.g. FIFO as an queue. STL priority_queue<Item> template class #include <queue> priority_queue<int> q2; Functions push, pop, empty, size , top (not front!) Several ways to specify priority (p. 411) Using a queue ensures that customers are served in the exact order in which they arrive. However, we often want to assign priorities to customers and severe those customers with higher priorities before those with lower priorities. For example in a hospital emergency room will handle the most serverely injured patients first even if they are not “first in the line” A computer operating system that keeps a queue of programs waiting for some resources, e.g. a printer, may give interactive programs a higher priority than batch processing programs that will not be picked up by the user untill the next day....

22 Reference Return Values for the stack, queue, and priority queue classes
In STL, the top (for stack) and front (for queue) functions have reference return values, e.g. in stack class definition: Item& top (); const Item& top() const; Can be used to change the top item If we declare stack<int> b; const stack<int> c; Which ones are correct? => 1. int i = b.top(); 2. b.push(i); 3. b.top() = 18; 4. c.top() = 18; 5. b.push(c.top()); V X Show a memory map of integer stack in order the discuss what it means to return a reference value class stack { public: ... Item& top () {return data[used-1];} const Item & top() const {return data[used-1]; } private: Item data[CAPACITY]; size_t used; };

23 Using a Stack Chapter 7 introduces the stack data type.
Several example applications of stacks are given in that chapter. This presentation shows another use called backtracking to solve the N-Queens problem. This lecture demonstrates an application of stacks: implementing backtracking to solve the N-Queens problem. The presentation includes a demonstration program which you can run at a couple points during the presentation. The demonstation requires EGA or VGA graphics on a PC. The best time for this lecture is after the students have read Chapter 7 on stacks. If the students want additional information about the N- queens problem, you can direct them to Programming Project 11 in Chapter 7. Data Structures and Other Objects Using C++

24 Presentation copyright 1997, Addison Wesley Longman,
For use with Data Structures and Other Objects Using C++ by Michael Main and Walter Savitch. Some artwork in the presentation is used with permission from Presentation Task Force (copyright New Vision Technologies Inc) and Corel Gallery Clipart Catalog (copyright Corel Corporation, 3G Graphics Inc, Archive Arts, Cartesia Software, Image Club Graphics Inc, One Mile Up Inc, TechPool Studios, Totem Graphics Inc). Students and instructors who use Data Structures and Other Objects Using C++ are welcome to use this presentation however they see fit, so long as this copyright notice remains intact. Feel free to send your ideas to: Michael Main

25 The N-Queens Problem Suppose you have 8 chess queens...
...and a chess board We'll start with a description of a problem which involves a bunch of queens from a chess game, and a chess board.

26 The N-Queens Problem Can the queens be placed on the board so that no two queens are attacking each other ? Some of you may have seen this problem before. The goal is to place all the queens on the board so that none of the queens are attacking each other.

27 The N-Queens Problem Two queens are not allowed in the same row...
If you play chess, then you know that this forbids two queens from being in the same row...

28 The N-Queens Problem Two queens are not allowed in the same row, or in the same column... ...or in the same column...

29 The N-Queens Problem Two queens are not allowed in the same row, or in the same column, or along the same diagonal. ...or along the same diagonal. As a quick survey, how many of you think that a solution will be possible? In any case, we shall find out, because we will write a program to try to find a solution. As an aside, if the program does discover a solution, we can easily check that the solution is correct. But suppose the program tells us that there is no solution. In that case, there are actually two possibilies to keep in mind: 1. Maybe the problem has no solution. 2. Maybe the problem does have a solution, and the program has a bug! Moral of the story: Always create an independent test to increase the confidence in the correctness of your programs.

30 The N-Queens Problem N Queens
The number of queens, and the size of the board can vary. N columns The program that we write will actually permit a varying number of queens. The number of queens must always equal the size of the chess board. For example, if I have six queens, then the board will be a six by six chess board. N rows

31 How the program works The program uses a stack to keep track of where each queen is placed. I want to show you the algorithm that the program uses. The technique is called backtracking. The key feature is that a stack is used to keep track of each placement of a queen.

32 How the program works Each time the program decides to place a queen on the board, the position of the new queen is stored in a record which is placed in the stack. For example, when we place the first queen in the first column of the first row, we record this placement by pushing a record onto the stack. This record contains both the row and column number of the newly-placed queen. ROW 1, COL 1

33 How the program works We also have an integer variable to keep track of how many rows have been filled so far. In addition to the stack, we also keep track of one other item: an integer which tells us how many rows currently have a queen placed. ROW 1, COL 1 1 filled

34 How the program works Each time we try to place a new queen in the next row, we start by placing the queen in the first column... ROW 2, COL 1 When we successfully place a queen in one row, we move to the next row. We always start by trying to place the queen in the first column of the new row. ROW 1, COL 1 1 filled

35 How the program works ...if there is a conflict with another queen, then we shift the new queen to the next column. ROW 2, COL 2 But each new placement must be checked for potential conflicts with the previous queen. If there is a conflict, then the newly-placed queen is shifted rightward. ROW 1, COL 1 1 filled

36 How the program works If another conflict occurs, the queen is shifted rightward again. ROW 2, COL 3 Sometimes another conflict will occur, and the newly-placed queen must continue shifting rightward. ROW 1, COL 1 1 filled

37 How the program works When there are no conflicts, we stop and add one to the value of filled. ROW 2, COL 3 When the new queen reaches a spot with no conflicts, then the algorithm can move on. In order to move on, we add one to the value of filled... ROW 1, COL 1 2 filled

38 How the program works Let's look at the third row. The first position we try has a conflict... ROW 3, COL 1 ROW 2, COL 3 ...and place a new queen in the first column of the next row. ROW 1, COL 1 2 filled

39 How the program works ...so we shift to column 2. But another conflict arises... ROW 3, COL 2 ROW 2, COL 3 In this example, there is a conflict with the placement of the new queen, so we move her rightward to the second column. ROW 1, COL 1 2 filled

40 How the program works ...and we shift to the third column.
Yet another conflict arises... ROW 3, COL 3 ROW 2, COL 3 Another conflict arises, so we move rightward to the third column. ROW 1, COL 1 2 filled

41 How the program works ...and we shift to column 4. There's still a conflict in column 4, so we try to shift rightward again... ROW 3, COL 4 ROW 2, COL 3 Yet another conflict arises, so we move to the fourth column. The key idea is that each time we try a particular location for the new queen, we need to check whether the new location causes conflicts with our previous queens. If so, then we move the new queen to the next possible location. ROW 1, COL 1 2 filled

42 How the program works ...but there's nowhere else to go. 2 filled
ROW 3, COL 4 ROW 2, COL 3 Sometimes we run out of possible locations for the new queens. This is where backtracking comes into play. ROW 1, COL 1 2 filled

43 How the program works When we run out of room in a row: pop the stack,
reduce filled by 1 and continue working on the previous row. ROW 2, COL 3 To backtrack, we throw out the new queen altogether, popping the stack, reducing filled by 1, and returning to the previous row. At the previous row, we continue shifting the queen rightward. ROW 1, COL 1 1 filled

44 How the program works Now we continue working on row 2, shifting the queen to the right. ROW 2, COL 4 Notice that we continue the previous row from the spot where we left off. The queen shifts from column 3 to column 4. We don't return her back to column 1. It is the use of the stack that lets us easily continue where we left off. The position of this previous queen is recorded in the stack, so we can just move the queen rightward one more position. ROW 1, COL 1 1 filled

45 How the program works This position has no conflicts, so we can increase filled by 1, and move to row 3. ROW 2, COL 4 The new position for row 2 has no conflicts, so we can increase filled by 1, and move again to row 3. ROW 1, COL 1 2 filled

46 How the program works In row 3, we start again at the first column. 2
ROW 3, COL 1 ROW 2, COL 4 At the new row, we again start at the first column. So the general rules are: When the algorithm moves forward, it always starts with the first column. But when the algorithm backtracks, it continues whereever it left off. ROW 1, COL 1 2 filled

47 Pseudocode for N-Queens
Initialize a stack where we can keep track of our decisions. Place the first queen, pushing its position onto the stack and setting filled to 0. repeat these steps if there are no conflicts with the queens... else if there is a conflict and there is room to shift the current queen rightward... else if there is a conflict and there is no room to shift the current queen rightward... Here’s the pseudocode for implementing the backtrack algorithm. The stack is initialized as an empty stack, and then we place the first queen. After the initialization, we enter a loop with three possible actions at each iteration. We'll look at each action in detail...

48 Pseudocode for N-Queens
repeat these steps if there are no conflicts with the queens... Increase filled by 1. If filled is now N, then the algorithm is done. Otherwise, move to the next row and place a queen in the first column. The nicest possibility is when none of the queens have any conflicts. In this case, we can increase filled by 1. If filled is now N, then we are done! But if filled is still less than N, then we can move to the next row and place a queen in the first column. When this new queen is placed, we'll record its position in the stack. Another aside: How do you suppose the program "checks for conflicts"? Hint: It helps if the stack is implemented in a way that permits the program to peek inside and see all of the recorded positions. This "peek inside" operation is often implemented with a stack, although the ability to actually change entries is limited to the usual pushing and popping.

49 Pseudocode for N-Queens
repeat these steps if there are no conflicts with the queens... else if there is a conflict and there is room to shift the current queen rightward... Move the current queen rightward, adjusting the record on top of the stack to indicate the new position. The second possiblity is that a conflict arises, and the new queen has room to move rightward. In this case, we just move the new queen to the right.

50 Pseudocode for N-Queens
repeat these steps if there are no conflicts with the queens... else if there is a conflict and there is room to shift the current queen rightward... else if there is a conflict and there is no room to shift the current queen rightward... The last possiblity is that a conflict exists, but the new queen has run out of room. In this case we backtrack: Pop the stack, Reduce filled by 1. We must keep doing these two steps until we find a row where the queen can be shifted rightward. In other words, until we find a row where the queen is not already at the end. At that point, we shift the queen rightward, and continue the loop. But there is one potential pitfall here! Backtrack! Keep popping the stack, and reducing filled by 1, until you reach a row where the queen can be shifted rightward. Shift this queen right.

51 Pseudocode for N-Queens
repeat these steps if there are no conflicts with the queens... else if there is a conflict and there is room to shift the current queen rightward... else if there is a conflict and there is no room to shift the current queen rightward... The potential pitfall: Maybe the stack becomes empty during this popping. What would that indicate? Answer: It means that we backtracked right back to the beginning, and ran out of possible places to place the first queen. In that case, the problem has no solution. Backtrack! Keep popping the stack, and reducing filled by 1, until you reach a row where the queen can be shifted rightward. Shift this queen right.

52 Summary of stack for backtracking
Stacks have many applications. The application which we have shown is called backtracking. The key to backtracking: Each choice is recorded in a stack. When you run out of choices for the current decision, you pop the stack, and continue trying different choices for the previous decision. A quick summary . . .

53 Summary and Homework Stacks (Read Chapter 7)
Self-Test: 1-5, 13-18 Queues (Read Sections 8.1 – 8.3) Self-Test: 1-5, 10,18-21 Priority Queues (Read Section 8.4) Self-Test: 25-27 References Return Values (Read Section 8.5 and p. 302 in Chapter 6) Self-Test: class note


Download ppt "CSC212 Data Structure - Section AB"

Similar presentations


Ads by Google