1 stacks and queues sections 3.6 and 3.7 chapter 3 lists, stacks, and queues abstract data types,...
TRANSCRIPT
1
Stacks and Queues
Sections 3.6 and 3.7
Chapter 3 Lists, Stacks, and QueuesAbstract Data Types, Vectors
2
Stack ADT - LIFO
• Collections: – Elements of some proper type T
• Operations: – Feature: Last In, First Out
– void push(T t)
– void pop()
– T top()
– bool empty()
– unsigned int size()
– constructor and destructor
3
Stack Model—LIFO
• Empty stack S– S.empty() is true
– S.top() not defined
– S.size() == 0
food chain stack
4
Stack Model—LIFO
• S.push(“mosquito”)– S.empty() is false
– S.top() == “mosquito”
– S.size() == 1
mosquito
food chain stack
5
Stack Model—LIFO
• S.push(“fish”)– S.empty() is false
– S.top() == “fish”
– S.size() == 2
fish
mosquito
food chain stack
6
Stack Model—LIFO
• S.push(“raccoon”)– S.empty() is false
– S.top() == “raccoon”
– S.size() == 3
raccoon
fish
mosquito
food chain stack
7
Stack Model—LIFO
• S.pop()– S.empty() is false
– S.top() == “fish”
– S.size() == 2
fish
mosquito
food chain stack
8
Implementations and Uses of Stack ADT
• Implementations – Any list implementation– list and vector C++ STL– Vector/List ADTs
• push_back()/pop_back() • push_front()/?
• Uses– Depth first search / backtracking– Evaluating postfix expressions– Converting infix to postfix– Function calls (runtime stack)– Recursion
9
Depth First Search—Backtracking
• Problem– Discover a path from start to goal
• Solution– Start from
• Node start
– Stop • If node is goal
– Go deep• If there is an unvisited
neighbor, go there
– Backtrack• Retreat along the path to find
an unvisited neighbor, if cannot go deeper
• Outcome– If there is a path from start to goal, DFS finds one such path
1
2 3 4
5 6 87
9 10 1211
start
goal
10
Depth First Search—Backtracking (2)
• Stack
1
2 3 4
5 6 87
9 10 1211
start
goal1Push
11
Depth First Search—Backtracking (3)
• Stack
1
2 3 4
5 6 87
9 10 1211
start
goal
2
1Push
Push
12
Depth First Search—Backtracking (4)
• Stack
1
2 3 4
5 6 87
9 10 1211
start
goal
5
2
1Push
Push
Push
13
Depth First Search—Backtracking (5)
• Stack
1
2 3 4
5 6 87
9 10 1211
start
goal
6
5
2
1Push
Push
Push
Push
14
Depth First Search—Backtracking (6)
• Stack
1
2 3 4
5 6 87
9 10 1211
start
goal
9
6
5
2
1Push
Push
Push
Push
Push
15
Depth First Search—Backtracking (7)
• Stack
1
2 3 4
5 6 87
9 10 1211
start
goal
6
5
2
1Push
Push
Push
Push
Pop
16
Depth First Search—Backtracking (8)
• Stack
1
2 3 4
5 6 87
9 10 1211
start
goal
5
2
1Push
Push
Push
Pop
17
Depth First Search—Backtracking (9)
• Stack
1
2 3 4
5 6 87
9 10 1211
start
goal
2
1Push
Push
Pop
18
Depth First Search—Backtracking (10)
• Stack
1
2 3 4
5 6 87
9 10 1211
start
goal1Push
Pop
19
Depth First Search—Backtracking (11)
• Stack
1
2 3 4
5 6 87
9 10 1211
start
goal
3
1Push
Push
20
Depth First Search—Backtracking (12)
• Stack
1
2 3 4
5 6 87
9 10 1211
start
goal
7
3
1Push
Push
Push
21
Depth First Search—Backtracking (13)
• Stack
1
2 3 4
5 6 87
9 10 1211
start
goal
10
7
3
1Push
Push
Push
Push
22
DFS Implementation
DFS() {stack<location> S;
// mark the start location as visitedS.push(start);
while (S is not empty) {t = S.top();if (t == goal) Success(S);if (// t has unvisited neighbors) {
// choose an unvisited neighbor n// mark n visited;S.push(n);
} else {BackTrack(S);
}}Failure(S);
}
23
DFS Implementation (2)
BackTrack(S) {while (!S.empty() && S.top() has no unvisited neighbors) {
S.pop();}
}
Success(S) {// print successwhile (!S.empty()) {
output(S.top());S.pop();
}}
24
Runtime Stack
• Runtime environment– Static
• Executable code
• Global variables
– Stack• Push for each function call
• Pop for each function return
• Local variables
– Heap• Dynamically allocated memories
• new and delete
static
stack
heap
program memory
25
Queue ADT - FIFO
• Collection– Elements of some proper type T
• Operations– Feature: First In, First Out– void push(T t)– void pop()– T front()– bool empty()– unsigned int size()– Constructors and destructors
26
Queue Model—FIFO
• Empty Q
animal parade queue
27
Queue Model—FIFO
• Q.Push(“ant”)
ant
front
back
animal parade queue
28
Queue Model—FIFO
• Q.Push(“bee”)
ant bee
front
back
animal parade queue
29
Queue Model—FIFO
• Q.Push(“cat”)
ant bee cat
front
back
animal parade queue
30
Queue Model—FIFO
• Q.Push(“dog”)
ant bee cat dog
front
back
animal parade queue
31
Queue Model—FIFO
• Q.Pop()
bee cat dog
front
back
animal parade queue
32
Queue Model—FIFO
• Q.Pop()
cat dog
front
back
animal parade queue
33
Queue Model—FIFO
• Q.Push(“eel”)• Q.Pop()• Q.Pop()
eel
front
back
animal parade queue
34
Implementations and Uses of Queue ADT
• Implementations– Any list implementation
•push_front()/pop_back()•push_back()/?
• Uses– Buffers– Breadth first search– Simulations– Producer-Consumer Problems
35
Breadth First Search
• Problem– Find a shortest path from start to goal
• Solution– Start from
• Node start
– Visit• All neighbors of the node
– Stop • If a neighbor is goal
– Otherwise• Visit neighbors two hops
away
– Repeat (Stop/Otherwise)• Visiting neighbors N hops
away
1
2 3 4
5 6 87
9 10 1211
start
goal
36
Breadth First Search (2)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
1
Push
37
Breadth First Search (3)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
Pop
38
Breadth First Search (4)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
2 3 4
Push Push Push
39
Breadth First Search (5)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
Pop
3 4
40
Breadth First Search (6)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
3 4 5 6
Push Push
41
Breadth First Search (7)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
4 5 6
Pop
42
Breadth First Search (8)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
4 5 6 7 8
Push Push
43
Breadth First Search (9)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
5 6 7 8
Pop
44
Breadth First Search (10)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
6 7 8
Pop
45
Breadth First Search (11)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
7 8
Pop
46
Breadth First Search (12)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
7 8 9
Push
47
Breadth First Search (13)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
8 9
Pop
48
Breadth First Search (14)
• Queue
1
2 3 4
5 6 87
9 10 1211
start
goal
8 9 10
Push
49
BFS Implementation
BFS {queue<location> Q;
// mark the start location as visitedQ.push(start);while (Q is not empty) {
t = Q.front();for (// each unvisited neighbor n of node
t) {Q.push(n);if (n == goal) Success(S);
}Q.pop();
}Failure(Q);
}
50
Adaptor Class
• Adapts the public interface of another class• Adaptee: the class being used• Adaptor: the new class being defined
– Uses protected object of the adaptee type
– Uses the adaptee’s methods to define adaptor methods
• Stack and Queue implemented via adaptor classes
51
Stack Adaptor Requirements
• Stack– push()– pop()– top()– empty()– size()
• Can use List, Deque– Push(): push_back()– Pop(): pop_back()
52
Class Stacktemplate <typename T, class Container>class Stack {
protected:Container c;
public:void push(const T & x) { c.push_back(x); }void pop() { c.pop_back(); }T top() const { return c.back(); }int empty() const { return c.empty(); }unsigned int size() const { return c.size(); }void clear() { c.clear(); }
};
• Declaration– Stack<float, List<float> > floatStack;– Stack<int, Vector<int> > intStack;
• For STL stack container– template <typename T, typename Container = deque<T> > class stack;– stack<char> charStack;
53
Queue Adaptor Requirements
• Queue– push()– pop ()– front()– empty()– size()
• Can use List, Deque– Push(): push_front()– Pop(): pop_back()
54
Class Queuetemplate <typename T, class Container>class Queue {
protected:Container c;
public:void push(const T & x) { c.push_back(x); }void pop() { c.pop_front(); }T front() const { return c.front(); }int empty() const { return c.empty(); }unsigned int size() const { return c.size(); }void clear() { c.clear(); }
};
• DeclarationQueue<float, List<float> > floatQueue;Queue<int, List<int> > intQueue;
• For STL stack containertemplate <typename T, typename Container = deque<T> > class queue;queue<char> charQueue;
55
Circular Array
frontback
animal parade queue
56
Circular Array
• Q.Push(“ant”)
ant
front
back
animal parade queue
57
Queue Model—FIFO
• Q.Push(“bee”)
ant bee
front back
animal parade queue
58
Queue Model—FIFO
• Q.Push(“cat”)
cat ant bee
frontback
animal parade queue
59
Queue Model—FIFO
• Q.Push(“dog”)
cat dog ant bee
frontback
animal parade queue
60
Queue Model—FIFO
• Q.Pop()
cat dog bee
frontback
animal parade queue
61
Queue Model—FIFO
• Q.Pop()
cat dog
front back
animal parade queue
62
Expanding the Array
a b c a b c
Where are front and back?
Why can’t we use all four locations?
c a b c a b
c a b a b c