CHAPTER 3 & 4 Stacks & Queues The Collection Framework 1 - - PDF document

chapter 3 4
SMART_READER_LITE
LIVE PREVIEW

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


slide-1
SLIDE 1

10/26/2017 1

CHAPTER 3 & 4

Stacks & Queues

The Collection Framework

slide-2
SLIDE 2

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.

slide-3
SLIDE 3

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)

slide-4
SLIDE 4

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

slide-5
SLIDE 5

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

slide-6
SLIDE 6

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

slide-7
SLIDE 7

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.

slide-8
SLIDE 8

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

slide-9
SLIDE 9

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

slide-10
SLIDE 10

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 } ...

slide-11
SLIDE 11

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(); }

slide-12
SLIDE 12

10/26/2017 12

Finding Palindromes (cont.)

... public boolean isPalindrome() { return inputString.equalsIgnoreCase(buildReverse()); } }

Discrete Event Simulation

Queue Applications

slide-13
SLIDE 13

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

slide-14
SLIDE 14

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

slide-15
SLIDE 15

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

slide-16
SLIDE 16

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.

slide-17
SLIDE 17

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

slide-18
SLIDE 18

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()

slide-19
SLIDE 19

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

slide-20
SLIDE 20

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

slide-21
SLIDE 21

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
slide-22
SLIDE 22

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

slide-23
SLIDE 23

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

slide-24
SLIDE 24

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

slide-25
SLIDE 25

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

slide-26
SLIDE 26

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)
slide-27
SLIDE 27

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 * -

slide-28
SLIDE 28

10/26/2017 28

Converting from Infix to Postfix (cont.) Converting from Infix to Postfix (cont.)

slide-29
SLIDE 29

10/26/2017 29

Converting from Infix to Postfix (cont.) Converting from Infix to Postfix (cont.)

slide-30
SLIDE 30

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)

slide-31
SLIDE 31

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

186 - 188)