04 Stack Queue
04 Stack Queue
04 Stack Queue
Lecture 4
Stacks and Queues
reading: "Appendix Q" (see course
website)
slides adapted from Marty Stepp and Hlne Martin
http://www.cs.washington.edu/143/
top
remove, peek
front
1
back
2
add
2
bottom
queue
stack
2
Stacks
stack: A collection based on the principle of adding
elements and retrieving them in the opposite order.
Last-In, First-Out ("LIFO")
Elements are stored in order of insertion.
We do not think of them as having indexes.
top
pop, peek
3
2
bottom
1
stack
4
Stacks in computer
science
Programming languages and compilers:
method calls are placed onto a stack (call=push,
return=pop)
compilers use stacks to evaluate expressions
method
3
return var
local vars
parameters
method
2
return var
local vars
parameters
return var
local vars
parameters
Sophisticated algorithms:
searching through a maze with "backtracking"
many programs use an "undo stack" of previous operations
5
Class Stack
Stack<E>()
isEmpty()
returns true if stack
has no elements
System.out.println(s.pop());
// 17
Stack limitations/idioms
You cannot loop over a stack in the usual way.
Stack<Integer> s = new Stack<Integer>();
...
for (int i = 0; i < s.size(); i++) {
do something with s.get(i);
}
Exercise
Consider an input file of exam scores in reverse ABC
order:
Yeilding
White
Todd
Tashev
...
Janet
Steven
Kim
Sylvia
87
84
52
95
What happened to my
stack?
Suppose we're asked to write a method max that
accepts a Stack of integers and returns the largest
integer in the stack:
// Precondition: !s.isEmpty()
public static void max(Stack<Integer> s) {
int maxValue = s.pop();
while (!s.isEmpty()) {
int next = s.pop();
maxValue = Math.max(maxValue, next);
}
return maxValue;
}
The algorithm is correct, but what is wrong with the code?
9
What happened to my
stack?
The code destroys the stack in figuring out its answer.
To fix this, you must save and restore the stack's contents:
public static void max(Stack<Integer> s) {
Stack<Integer> backup = new Stack<Integer>();
int maxValue = s.pop();
backup.push(maxValue);
while (!s.isEmpty()) {
int next = s.pop();
backup.push(next);
maxValue = Math.max(maxValue, next);
}
while (!backup.isEmpty()) {
// restore
s.push(backup.pop());
}
return maxValue;
}
10
Queues
queue: Retrieves elements in the order they were added.
First-In, First-Out ("FIFO")
Elements are stored in order of
insertion but don't have indexes.
Client can only add to the end of the
queue, and can only examine/remove
the front of the queue.
remove, peek
front
1
back
2
add
queue
Queues in computer
science
Operating systems:
queue of print jobs to send to the printer
queue of programs / processes to be run
queue of network data packets to send
Programming:
modeling a line of customers or clients
storing a queue of computations to be performed in order
Programming with
Queues
add(value) places given value at back of queue
remove()
removes value from front of queue and returns it;
throws a NoSuchElementException if queue is
empty
peek()
returns front value from queue without removing
it;
returns null if queue is empty
size()
// 42
Queue idioms
As with stacks, must pull contents out of queue to view
them.
// process (and destroy) an entire queue
while (!q.isEmpty()) {
do something with q.remove();
}
another idiom: Examining each element exactly once.
int size = q.size();
for (int i = 0; i < size; i++) {
do something with q.remove();
(including possibly re-adding it to the queue)
}
Why do we need the size variable?
14
Exercise
Modify our exam score program so that it reads the
exam scores into a queue and prints the queue.
Next, filter out any exams where the student got a score
of 100.
Then perform your previous code of reversing and
printing the remaining students.
What if we want to further process the exams after printing?
16
Exercises
Write a method stutter that accepts a queue of
integers as a parameter and replaces every element of
the queue with two copies of that element.
front [1, 2, 3] back
becomes
front [1, 1, 2, 2, 3, 3] back