CHAPTER 3 & 4 Stacks & Queues The Collection Framework 1 - - PDF document
CHAPTER 3 & 4 Stacks & Queues The Collection Framework 1 - - PDF document
10/26/2017 CHAPTER 3 & 4 Stacks & Queues The Collection Framework 1 10/26/2017 Stack Abstract Data Type A stack is one of the most commonly used data structures in computer science A stack can be compared to a Pez dispenser
10/26/2017 2
Stack Abstract Data Type
A stack is one of the most commonly used
data structures in computer science
A stack can be compared to a Pez
dispenser
Only the top item can be accessed You can extract only one item at a time The top element in the stack is the last
added to the stack (most recently)
The stack’s storage policy is Last-In, First-
Out, or LIFO
Java Collections: Stack
The Java API includes a Stack
class as part of the package
java.util :
Stack<String> myStringStack = new Stack<String>(); Stack<Place> myPlacesStack = new Stack<Places>(); myStringStack.push(“Deepak”); myPlacesStack.push(new Place(“19010”, “Bryn Mawr”, “PA”)); etc.
10/26/2017 3
Specification of the Stack Abstract Data Type
Only the top element of a stack is visible; therefore the number of
- perations performed by a stack are few
We need the ability to
test for an empty stack (empty) inspect the top element (peek) retrieve the top element (pop) put a new element on the stack (push)
A Stack of Strings
“Rich” is the oldest element on the stack and “Jonathan” is
the youngest (Figure a)
String last = names.peek(); stores a reference
to “Jonathan” in last
String temp = names.pop(); removes “Jonathan”
and stores a reference to it in temp (Figure b)
names.push(“Philip”);
pushes “Philip” onto the stack (Figure c)
10/26/2017 4
Other examples of stacks
Back button in browser Palindrome checker
Go hang a salami, I’m a lasagna hog!
Matching parentheses Expression evaluation printStackTrace()
7
Queue
The queue, like the stack, is a widely used data
structure
A queue differs from a stack in one important way A stack is LIFO list – Last-In, First-Out while a queue is FIFO list, First-In, First-Out
10/26/2017 5
Queue Abstract Data Type
A queue can be visualized as a line of customers waiting for
service
The next person to be served is the one who has waited the
longest
New elements are placed at the end of the line
Print Queue
Operating systems use queues to keep track of tasks waiting for a scarce resource ensure that the tasks are carried out in the order they were
generated
Print queue: printing is much slower than the process of
selecting pages to print, so a queue is used
10/26/2017 6
Specification for a Queue Interface
The Queue interface implements the Collection interface
(and therefore the Iterable interface), so a full implementation of Queue must implement all required methods of Collection (and the Iterable interface)
Class LinkedList Implements the Queue Interface
The LinkedList class provides methods for inserting and
removing elements at either end of a double-linked list, which means all Queue methods can be implemented easily
The Java 5.0 LinkedList class implements the Queue interface
Queue<String> names = new LinkedList<String>();
creates a new Queue reference, names, that stores references to
String objects
The actual object referenced by names is of type
LinkedList<String>, but because names is a type Queue<String> reference, you can apply only the Queue methods
to it
10/26/2017 7
The Collection Framework Java Collections: Queue
The Java API includes a Queue
interface as part of the package
java.util :
Queue<String> myStringQueue = new LinkedList<String>(); Queue<Place> myPlacesQueue = new LinkedList<Places>(); myStringQueue.offer(“Deepak”); myPlacesQueue.offer(new Place(“19010”, “Bryn Mawr”, “PA”)); etc.
10/26/2017 8
Examples of Queues
Simulations of real life situations: Service Queues Scheduling processes in Operating Systems Keep track of state in systematic searches
15
Stacks & Queues
java.util.Stack<E> boolean empty() E peek() E pop() Both raise EmptyStackException E push(e) + all List<E> operations java.util.Queue<E> boolean add(e) boolean offer(e) E remove() E poll() E peek() E element()
- Return T/F/null
Raise NoSuchElementException
16
10/26/2017 9
Section 3.2
Stack Applications Finding Palindromes
Palindrome: a string that reads identically in either
direction, letter by letter (ignoring case)
kayak "I saw I was I" “Able was I ere I saw Elba” "Level madam level" Problem: Write a program that reads a string and
determines whether it is a palindrome
10/26/2017 10
Finding Palindromes (cont.) Finding Palindromes (cont.)
import java.util.*; public class PalindromeFinder { private String inputString; private Stack<Character> charStack = new Stack<Character>(); public PalindromeFinder(String str) { inputString = str; fillStack(); // fills the stack with the characters in inputString } ...
10/26/2017 11
Finding Palindromes (cont.)
Solving using a stack: Push each string character, from left to right, onto a
stack
k a k y k a k a a a y a y a k k k y a k a y a k k
private void fillStack() { for(int i = 0; i < inputString.length(); i++) { charStack.push(inputString.charAt(i)); } }
k a y k a y k a
Finding Palindromes (cont.)
Solving using a stack: Pop each character off the stack, appending each to
the StringBuilder result
k k a a k y a k y a k a y a k k
private String buildReverse(){ StringBuilder result = new StringBuilder(); while(!charStack.empty()) { result.append(charStack.pop()); } return result.toString(); }
10/26/2017 12
Finding Palindromes (cont.)
... public boolean isPalindrome() { return inputString.equalsIgnoreCase(buildReverse()); } }
Discrete Event Simulation
Queue Applications
10/26/2017 13
Discrete Event Simulation
Single Queue, single server Single Queue, multiple servers Multiple Queue, multiple servers
25
Rear Front Rear Front Rear Front Rear Front
… … …
Example: Single Queue, Single Server
Arrival process How customers arrive: What is inter-arrival time?
E.g. between 1-3 min
Service mechanism: How long will service take?
E.g. 0.5 to 2.0 min
Queue characteristics: FIFO
26
Rear Front
10/26/2017 14
Example Data
Customer Inter-arrival Time Service Time (min) C1 1.9 1.7 C2 1.3 1.8 C3 1.1 1.5 C4 1.0 0.9 27 T Arrival Queue Server
Depart
[] Idle 1.9 C1 [] C1 3.2 C2 [C2] C1 3.6 [] C2
C1
4.3 C3 [C3] C2 5.3 C4 [C4, C3] C2 5.4 [C4] C3
C2
6.9 [] C4
C2
7.8 []
C4
Queue Simulation
Application: Lab Printer Simulation
There is one printer in the Computer Science Lab At any given time, there may be as many as 10
students working in the lab
Each student may print upto twice in an hour Print jobs are 1-20 pages long ∴ There are up to 20 print jobs in an hour Question: What is the chance that in any given
second there will be a print job scheduled?
28
10/26/2017 15
Application: Lab Printer Simulation
There is one printer in the Computer Science Lab At any given time, there may be as many as 10
students working in the lab
Each student may print upto twice in an hour Print jobs are 1-20 pages long ∴ There are up to 20 print jobs in an hour Question: What is the chance that in any given
second there will be a print job scheduled?
29
Application: Lab Printer Simulation
There is one printer in the CS Lab (10 ppm) At any given time, there may be as many as 10
students working in the lab
Each student may print upto twice in an hour Print jobs are 1-20 pages long ∴ There are up to 20 print jobs in an hour Question: What will the average wait time be for
students to receive their printouts?
Question: What would the average wait time be if
the printer were upgraded to 20 ppp?
30
10/26/2017 16
Section 3.3
Implementing a Stack Java Collections: Stack
The Java API includes a Stack
class as part of the package
java.util :
Stack<String> myStringStack = new Stack<String>(); Stack<Place> myPlacesStack = new Stack<Places>(); myStringStack.push(“Deepak”); myPlacesStack.push(new Place(“19010”, “Bryn Mawr”, “PA”)); etc.
10/26/2017 17
Implementing a Stack with a List Component
We can write a class, ListStack, that has a List component (in the
example below, theData)
We can use either the ArrayList, or the LinkedList classes, as all
implement the List interface. The push method, for example, can be coded as
public E push(E obj) { theData.add(obj); return obj; }
A class which adapts methods of another class by giving different names to
essentially the same methods (push instead of add) is called an adapter class
Writing methods in this way is called method delegation
Implementing a Stack Using an Array
If we implement a stack as an array,
we would need . . .
public class ArrayStack<E> implements StackInt<E> { private E[] theData; int topOfStack = -1; private static final int INITIAL_CAPACITY = 10; public ArrayStack() { theData = (E[])new Object[INITIAL_CAPACITY]; } // ArrayStack() Allocate storage for an array with a default capacity Keep track of the top of the stack (subscript of the element at the top of the stack; for empty stack = -1) There is no size variable or method
10/26/2017 18
Implementing a Stack Using an Array (cont.)
ArrayStack theData = topOfStack = -1 Object[] [0] = null [1] = null [2] = null [3] = null [4] = null [5] = null [6] = null [7] = null [8] = null [9] = null
public E push(E obj) { if (topOfStack == theData.length - 1){ reallocate(); } topOfStack++; theData[topOfStack] = obj; return obj; }
Character value = 'J' 1 Character value = 'a' Character value = 'v' 2 Character value = 'a' 3
Implementing a Stack Using an Array (cont.)
public E pop() { if (empty()) { throw new EmptyStackException(); } return theData[topOfStack--]; } // pop()
10/26/2017 19
Implementing a Stack using an array
37 import java.util.EmptyStackException; public class ArrayStack<E> implements StackInt<E> { E[] theData; int topOfStack = -1; // Initially empty stack. private static final int INITIAL_CAPACITY = 10; public ArrayStack() { theData = (E[]) new Object[INITIAL_CAPACITY]; } // ArrayStack() public E push(E obj) { if (topOfStack == theData.length - 1) { reallocate(); } topOfStack++; theData[topOfStack] = obj; return obj; } // push() public E pop() { if (empty()) { throw new EmptyStackException(); } return theData[topOfStack--]; } // pop() } // class ArrayStack<E>
Implementing a Stack as a Linked Data Structure
We can also implement a stack using a linked list of
nodes
It is easiest to insert and delete from the head of a list push inserts a node at the head and pop deletes the node at the head when the list is empty, pop returns null
10/26/2017 20
Implementing a Stack as a Linked Data Structure (cont.)
39
Listing 3.5 (LinkedStack.java, pages 168 - 169)
Comparison of Stack Implementations
The easiest implementation uses a List component
(ArrayList is the simplest) for storing data
An underlying array requires reallocation of space
when the array becomes full, and
an underlying linked data structure requires allocating
storage for links
As all insertions and deletions occur at one end, they
are constant time, O(1), regardless of the type of implementation used
10/26/2017 21
Section 3.4
Additional Stack Applications Additional Stack Applications
Postfix and infix notation Expressions normally are written in infix form, but it easier to evaluate an expression in postfix form since
there is no need to group sub-expressions in parentheses
- r worry about operator precedence
10/26/2017 22
Evaluating Postfix Expressions
Write a class that evaluates a postfix expression Use the space character as a delimiter between
tokens
Evaluating Postfix Expressions (cont.)
- 1. create an empty stack of integers
- 2. while there are more tokens
- 3. get the next token
- 4. if the first character of the token is a digit
- 5. push the token on the stack
- 6. else if the token is an operator
- 7. pop the right operand off the stack
- 8. pop the left operand off the stack
- 9. evaluate the operation
- 10. push the result onto the stack
- 11. pop the stack and return the result
7
- 20
* 4 4 4
10/26/2017 23
Evaluating Postfix Expressions (cont.)
- 1. create an empty stack of integers
- 2. while there are more tokens
- 3. get the next token
- 4. if the first character of the token is a digit
- 5. push the token on the stack
- 6. else if the token is an operator
- 7. pop the right operand off the stack
- 8. pop the left operand off the stack
- 9. evaluate the operation
- 10. push the result onto the stack
- 11. pop the stack and return the result
7
- 20
* 4 4 4 7 7 4
Evaluating Postfix Expressions (cont.)
- 1. create an empty stack of integers
- 2. while there are more tokens
- 3. get the next token
- 4. if the first character of the token is a digit
- 5. push the token on the stack
- 6. else if the token is an operator
- 7. pop the right operand off the stack
- 8. pop the left operand off the stack
- 9. evaluate the operation
- 10. push the result onto the stack
- 11. pop the stack and return the result
7
- 20
* 4 7 7 4
4 * 7
10/26/2017 24
Evaluating Postfix Expressions (cont.)
- 1. create an empty stack of integers
- 2. while there are more tokens
- 3. get the next token
- 4. if the first character of the token is a digit
- 5. push the token on the stack
- 6. else if the token is an operator
- 7. pop the right operand off the stack
- 8. pop the left operand off the stack
- 9. evaluate the operation
- 10. push the result onto the stack
- 11. pop the stack and return the result
7
- 20
* 4 7
28 28
Evaluating Postfix Expressions (cont.)
- 1. create an empty stack of integers
- 2. while there are more tokens
- 3. get the next token
- 4. if the first character of the token is a digit
- 5. push the token on the stack
- 6. else if the token is an operator
- 7. pop the right operand off the stack
- 8. pop the left operand off the stack
- 9. evaluate the operation
- 10. push the result onto the stack
- 11. pop the stack and return the result
7
- 20
* 4 7
28
20 20
28
10/26/2017 25
Evaluating Postfix Expressions (cont.)
- 1. create an empty stack of integers
- 2. while there are more tokens
- 3. get the next token
- 4. if the first character of the token is a digit
- 5. push the token on the stack
- 6. else if the token is an operator
- 7. pop the right operand off the stack
- 8. pop the left operand off the stack
- 9. evaluate the operation
- 10. push the result onto the stack
- 11. pop the stack and return the result
7
- 20
* 4 7 20 28
28 - 20
Evaluating Postfix Expressions (cont.)
- 1. create an empty stack of integers
- 2. while there are more tokens
- 3. get the next token
- 4. if the first character of the token is a digit
- 5. push the token on the stack
- 6. else if the token is an operator
- 7. pop the right operand off the stack
- 8. pop the left operand off the stack
- 9. evaluate the operation
- 10. push the result onto the stack
- 11. pop the stack and return the result
7
- 20
* 4 7
8 8
10/26/2017 26
Evaluating Postfix Expressions (cont.)
- 1. create an empty stack of integers
- 2. while there are more tokens
- 3. get the next token
- 4. if the first character of the token is a digit
- 5. push the token on the stack
- 6. else if the token is an operator
- 7. pop the right operand off the stack
- 8. pop the left operand off the stack
- 9. evaluate the operation
- 10. push the result onto the stack
- 11. pop the stack and return the result
7
- 20
* 4 7
8
Evaluating Postfix Expressions (cont.)
52
Listing 3.6 (PostfixEvaluator.java, pages 173
- 175)
10/26/2017 27
Converting from Infix to Postfix
Convert infix expressions to postfix expressions Assume:
expressions consists of only spaces, operands, and operators space is a delimiter character all operands that are identifiers begin with a letter or underscore all operands that are numbers begin with a digit
Converting from Infix to Postfix (cont.)
54
Example: convert
w – 5.1 / sum * 2 to its postfix form w 5.1 sum / 2 * -
10/26/2017 28
Converting from Infix to Postfix (cont.) Converting from Infix to Postfix (cont.)
10/26/2017 29
Converting from Infix to Postfix (cont.) Converting from Infix to Postfix (cont.)
10/26/2017 30
Converting from Infix to Postfix (cont.)
59
Listing 3.7 (InfixToPostfix.java, pages 181 -
183)
Converting from Infix to Postfix (cont.)
Testing Use enough test expressions to satisfy yourself that the
conversions are correct for properly formed input expressions
Use a driver to catch InfixToPostfix.SyntaxErrorException Listing 3.8 (TestInfixToPostfix.java, page
184)
10/26/2017 31
Converting Expressions with Parentheses
The ability to convert expressions with parentheses
is an important (and necessary) addition
Modify processOperator to push each
- pening parenthesis onto the stack as soon as it is
scanned
When a closing parenthesis is encountered, pop
- ff operators until the opening parenthesis is
encountered
Listing 3.9 (InfixToPostfixParens.java, pages