1 Stacks and Queues Sections 3.6 and 3.7 Chapter 3 Lists, Stacks, and Queues Abstract Data Types,...

Post on 23-Dec-2015

237 views 7 download

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