85
Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with Java From Control Structures through Data Structures by Tony Gaddis and Godfrey Muganda Chapter 21 : Stacks and Queues

Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Starting Out with Java

From Control Structures through Data Structures

by Tony Gaddis and Godfrey Muganda

Chapter 21 : Stacks and Queues

Page 2: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 2

Chapter Topics

• Stacks and Their Applications

• Array Implementation of Stacks

• Linked Implementation of Stacks

• Queues and Their Applications

• Array Implementation of Queues

• Linked Implementation of Queues

Page 3: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 3

Stacks

A stack is a collection of items that allows the

following operations:

– boolean empty() checks if the stack is empty.

– void push(E o) adds an object o to the stack.

– E pop() removes and returns the item most recently

added to the stack.

Page 4: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 4

Last In First Out

A stack is a Last in-First-Out container: the last

item added is the first to be removed.

Page 5: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 5

The Stack peek() Operation

Most stacks support a

E peek()

operation: this returns, but does not remove from the stack, the item most recently added to the stack

peek() returns the item that will be removed by the next call to pop()

Page 6: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 6

Applications of Stacks

Many collections of items are naturally regarded as stacks: – A stack of plates in a cafeteria.

– Cars packed in a narrow driveway.

– Return addresses of method calls in an executing program.

Page 7: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 7

Plates in a Cafeteria

• Plates are stacked in a column.

• A new plate is added to the top of the column of plates.

• Plates are removed from the top of the column of plates, so that the last plate added is the first removed.

Page 8: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8

Method Return Addresses

• Programs often make chains of method calls.

• The last method called is the first to return.

• The compiler uses a stack to maintain the list of

return addresses for executing methods in a

stack.

Page 9: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 9

Java Collection Framework Stack Class

The JCF provides a generic implementation of a stack: – Stack<E>() (constructor)

– E push(E element)

– E pop()

– E peek()

– boolean empty()

Page 10: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 10

The JCF Stack Class

• The JCF stack can be used to create stacks of

String, numeric values, or any other types.

• Following example demonstrates the use of the

JCF Stack class to work with strings.

Page 11: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 11

The JCF Stack Class import java.util.Stack;

public class StackDemo { public static void main(String [] args) { // Create a stack of strings and add some names Stack<String> stack = new Stack<String>(); String [ ] names = {"Al", "Bob", "Carol"}; System.out.println("Pushing onto the stack the names:"); System.out.println("Al Bob Carol"); for (String s : names) stack.push(s); // Now pop and print everything on the stack String message = "Popping and printing all stack values:"; System.out.println(message); while (! stack.empty() ) System.out.print( stack.pop() + " “ ); } }

Page 12: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 12

Stacks of Primitive Values

• The JCF Stack class does not support stacks of

primitive types.

• To create a stack that can store a primitive type,

create a stack of the corresponding wrapper

type.

Page 13: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 13

Stack of Primitive Types

These statements will not compile:

Stack<int> myIntStack;

Stack<boolean> myBoolStack;

Use stacks of the corresponding wrapper class types:

Stack<Integer> myIntStack;

Stack<Boolean> myBoolStack;

Page 14: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 14

Autoboxing

Once a stack of a wrapper type has been declared and instantiated, you can use the primitive type in all stack methods.

The compiler automatically boxes primitive values passed as parameters to the stack methods to form the required wrapper class types.

Page 15: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 15

Unboxing

The compiler automatically unboxes wrapper types returned as values by the stack methods to form the corresponding

primitive value.

Page 16: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 16

Autoboxing and Unboxing public class StackDemo

{ public static void main(String [] args) { Stack<Integer> intStack = new Stack<Integer>(); // Push some numbers onto the stack for (int k =1 ; k < ; k++) intStack.push(k*k); // Pop and print all numbers while (!intStack.empty()) { int x = intStack.pop(); System.out.print( x + " "); } } }

Page 17: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 17

Array Implementation of Stacks

Page 18: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 18

Array Implementation of Stacks

A stack can be implemented by using an array to

hold the items being stored.

Page 19: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 19

Array Implementation of Stacks

A stack can be implemented by using an array to

hold the items being stored.

push can be implemented so it stores items at

the end of the array.

Page 20: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 20

Array Implementation of Stacks

A stack can be implemented by using an array to

hold the items being stored.

push can be implemented so it stores items at

the end of the array.

pop can be implemented so it returns the item at

the end of the array.

Page 21: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 21

Array Implementation of Stacks

A stack can be implemented by using an array to hold the items being stored.

push can be implemented so it stores items at the end of the array.

pop can be implemented so it returns the item at the end of the array.

A variable top can be used to track the actual end of the array, where the next item will be added.

Page 22: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 22

Pushing Items Onto a Stack

Page 23: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 23

Array Implementation of a Stack

Use a class ArrayStack with private fields:

int [ ] s;

int top; // points to actual end of the stack

Constructor:

ArrayStack(int capacity)

{

s = new int[capacity];

top = 0;

}

Page 24: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 24

Array Implementation of a Stack

The method for adding an item to the stack:

void push(int x)

{

if (top == s.length)

throw new IllegalStateException();

s[top] = x;

top ++;

}

Page 25: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 25

Array Implementation of a Stack

The method to retrieve an item from the stack:

int pop()

{

if (top == 0)

then throw new IllegalStateException();

top --;

return s[top];

}

Page 26: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 26

Stack Overflow and Underflow

The exception thrown when an attempt is made

to push a value onto a stack whose array if full is

called a stack overflow exception.

Page 27: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 27

Stack Overflow and Underflow

The exception thrown when an attempt is made

to push a value onto a stack whose array if full is

called a stack overflow exception.

The exception thrown when an attempt is made

to pop an empty stack is sometimes called stack

underflow.

Page 28: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 28

Checking for an Empty Stack

You check for an empty stack by looking to see if

top is 0 :

boolean empty()

{

return top == 0;

}

Page 29: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 29

Peek()

To return the item currently at the “top” of the stack:

int peek()

{

if (top ==0 )

throw new IllegalStateException();

return s[top-1];

}

Page 30: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 30

Array-Based Stacks of Other Types

Implementing stacks of other types is similar to

implementing a stack of int.

Main difference: when a value of a reference type is

removed from the stack, the array entry must be set to

null.

s[top-1] = null;

Forgetting to set the array entry to null will keep the

removed item from being garbage collected.

Page 31: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 31

Popping a Reference Type public String pop()

{

if (empty())

throw new EmptyStackException();

else

{

int retVal = s[top-1];

s[top-1] = null; // Facilitate garbage collection

top--;

return retVal;

}

}

Page 32: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 32

Linked Implementation of Stacks

A linked list can be used to implement a stack by using the head of the list as the “top” of the stack:

Page 33: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 33

Linked Implementation of Stacks

A linked list can be used to implement a stack by

using the head of the list as the “top” of the

stack:

push(E o) adds a new item as the new head of

the linked list.

Page 34: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 34

Linked Implementation of Stacks

A linked list can be used to implement a stack by

using the head of the list as the “top” of the

stack:

push(E o) adds a new item as the new head of

the linked list.

E pop() removes and returns the head of the

linked list.

Page 35: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 35

Implementing a Stack with a Linked List

A reference

Node top; // list head

is used to represent the linked list that holds

the stack items.

Page 36: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 36

Linked Implementation of a Stack

class LinkedStack

{ // Node class used for linked list

private class Node

{

String element;

Node next;

Node (String e, Node n)

{

element = e;

next = n;

}

}

private Node top = null; // head of list is top of stack

}

Page 37: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 37

Linked Implementation of a Stack

A linked stack after pushing two items:

Page 38: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 38

Linked Implementation of Stacks

The linked stack of the previous slide after

pushing the string Carol.

Page 39: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 39

Linked Implementation of Stack

Methods

All of the stack methods have straightforward

implementations using linked lists:

– boolean empty()

– String pop()

– void push(String e)

– String peek()

Page 40: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 40

Checking for an Empty Stack

The stack is empty if the head pointer top is null:

boolean empty()

{

return top == null;

}

Page 41: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 41

The Stack push Operation

Adds a new item at the beginning of the

underlying linked list:

void push(String s)

{

top = new Node(s, top);

}

Page 42: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 42

The Stack pop Operation

Removes and returns the element at the head of the stack’s linked list:

public String pop() { if (empty()) throw new IllegalStateException(); else { String retValue = top.element; top = top.next; return retValue; } }

Page 43: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 43

The Stack peek Operation

Return without removing the element stored in the head of the list.

public String peek() { if (empty()) throw new IllegalStateException(); else return top.element; }

Page 44: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Simple Applications of Stack:

Checking for Balanced Braces

• A stack can be used to verify whether a

program contains balanced braces

– An example of balanced braces

abc{defg{ijk}{l{mn}}op}qr

– An example of unbalanced braces

abc{def}}{ghij{kl}m

Page 45: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Checking for Balanced Braces

• Requirements for balanced braces

– Each time you encounter a “}”, it matches

an already encountered “{”

– When you reach the end of the string, you

have matched each “{”

Page 46: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Checking for Balanced Braces

Traces of the algorithm that checks for balanced braces

Page 47: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Checking for Balanced Braces

• StackException

– A Java method that implements the

balanced-braces algorithm should do one

of the following

• Take precautions to avoid an exception

• Provide try and catch blocks to handle a

possible exception

Page 48: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Recognizing Strings in a Language

• Language L L = {w$w’ : w is a possible empty string of characters other than $,

w’ = reverse(w) }

– A stack can be used to determine whether a given

string is in L

• Traverse the first half of the string, pushing each

character onto a stack

• Once you reach the $, for each character in the second

half of the string, pop a character off the stack

– Match the popped character with the current character in

the string

Page 49: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Application:

Algebraic Expressions

• When the stack is used to solve a

problem, the use of the stack operations

should not depend on its

implementation

• To evaluate an infix expressions

– Convert the infix expression to postfix form

– Evaluate the postfix expression

Page 50: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Evaluating Postfix Expressions

• A postfix calculator

– Requires you to enter postfix expressions • Example: 2, 3, 4, +, *

– When an operand is entered, the calculator • Pushes it onto a stack

– When an operator is entered, the calculator • Applies it to the top two operands of the stack

• Pops the operands from the stack

• Pushes the result of the operation on the stack

Page 51: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Evaluating Postfix Expressions

The action of a postfix calculator when evaluating the expression 2 * (3 + 4)

Page 52: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Evaluating Postfix Expressions

• To evaluate a postfix expression which is entered as a string of characters

– Simplifying assumptions • The string is a syntactically correct postfix

expression

• No unary operators are present

• No exponentiation operators are present

• Operands are single lowercase letters that represent integer values

Page 53: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Converting Infix Expressions to

Equivalent Postfix Expressions

• An infix expression can be evaluated by first

being converted into an equivalent postfix

expression

• Facts about converting from infix to postfix

– Operands always stay in the same order with

respect to one another

– An operator will move only “to the right” with

respect to the operands

– All parentheses are removed

Page 54: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Converting Infix Expressions to

Equivalent Postfix Expressions

A trace of the algorithm that converts the infix expression a - (b + c * d)/e to postfix form

Page 55: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 60

Queues

Page 56: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 61

Queues

A Queue is a collection that allows elements to

be added and removed in a First-In-First-Out

order.

Elements are removed from the queue in the

same order in which they are added.

Page 57: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 62

Queue Applications

Many applications have clients that arrive

needing service, and depart after being served.

Clients who arrive are added to a queue.

Clients are removed from the queue, receive

service, and leave.

Page 58: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 63

Queue Applications

• A print server may service many workstations in

a computer network. The print server uses a

queue to hold print job requests waiting to be

sent to the printer.

• A simulation of cars going through a toll booth

would use a queue to hold cars lining up to pay

toll.

Page 59: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 64

Queue Operations

• enqueue(E x) : adds an item to the queue.

Page 60: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 65

Queue Operations

• enqueue(E x) : adds an item to the queue.

• E dequeue() : removes and returns an item from

the queue.

Page 61: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 66

Queue Operations

• enqueue(E x) : adds an item to the queue.

• E dequeue() : removes and returns an item from

the queue.

• E peek() : returns, but does not remove, the item

that will be returned by the next call to

dequeue().

Page 62: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 67

Queue Operations

• enqueue(E x) : adds an item to the queue

• E dequeue() : remove and return an item from

the queue

• E peek() : return, but do not remove, the item

that will be returned by the next call to

dequeue()

• boolean empty() : check to see if the queue is

empty

Page 63: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 68

Implementation of Queues

• An array-based implementation uses an array to

hold queue elements.

Page 64: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 69

Implementation of Queues

• An array-based implementation uses an array to

hold queue elements.

• A linked list implementation uses a linked list to

hold queue elements.

Page 65: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 70

Conceptual View of an Array

A queue can be viewed as a linear sequence of items where

– new items are added at one end (the rear of the

queue)

– new items are removed from the other end (the front of the queue)

Page 66: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 71

Array Implementation of a Queue

• Requires an array to hold the queue elements:

String [ ] q; // Queue will hold strings

Page 67: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 72

Array Implementation of a Queue

• Requires an array to hold the queue elements:

String [ ] q; // Queue will hold strings

• Requires an index to keep track of the array slot

that will hold the next item to be added to the

queue:

int rear; // Where next item will be added

Page 68: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 73

Array Implementation of a Queue

• Requires an array to hold the queue elements:

String [ ] q; // Queue will hold strings

• Requires an index to keep track of the array slot that will hold the next item to be added to the queue:

int rear; // Where next item will be added

• Requires an index to keep track of the array slot the holds the next item to be removed from the queue:

int front; // Next item to be removed

Page 69: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 74

An Invariant for the Array

Implementation

• front: index of next item to be dequeued. This

slot is normally filled, but is unfilled when the

queue is empty.

• rear: index of slot that will receive the next item

to be enqueued. This slot is normally unfilled,

but is filled when the array is completely filled.

Page 70: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 75

Simplistic Implementation of

enqueue

• Initially rear points to the first available unfilled position in the array.

• A new item x is added to the queue at rear as follows:

q[rear] = x;

rear ++;

As a new item is added, rear is incremented to point to the next unfilled position in the array.

Page 71: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 76

Simplistic Implementation of

dequeue

• The item is removed from the queue at the index

front.

• The item at front is saved so it can be returned,

and front is incremented to point to the next item

in the queue:

String element = q[front];

q[front] = null;

front ++;

Page 72: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 77

Use of the Array as a Circular

Buffer • The simplistic enqueue fills array slots in order of

increasing index

• The simplistic dequeue empties array slots behind enqueue, also in order of increasing index.

• By the time enqueue gets to the end of the array, dequeue may have emptied out slots at the beginning, so enqueue should wrap around to the beginning of the array when it gets to the end.

Page 73: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 78

Use of an Array-Based Queue

Page 74: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 79

Using an Array as a Circular Buffer

Page 75: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 80

Tracking the Size of the Queue

• Tracking the number of elements in the queue is

useful in determining if the queue is empty, and

when the queue is full.

• An integer variable is used to track the size:

int size = 0;

• The variable size is incremented by enqueue,

and decremented by dequeue.

Page 76: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 81

Implementation of enqueue

The correct implementation of enqueue must

– Increment the size variable.

– Add the new item at rear.

– Increment rear and wrap around to 0 when

rear reaches the end of the array.

Page 77: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 82

The Array-Based Enqueue Method

public void enqueue(String s) { if (size == q.length) throw new IllegalStateException(); else { // Add to rear size ++; q[rear] = s; rear ++; // If at end of array, wrap around

if (rear == q.length) rear = 0; } }

Page 78: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 83

Implementation of dequeue

The correct implementation of dequeue must

– Decrement the size variable.

– Remove an item at front.

– Increment front and wrap around to 0 when front

reaches the end of the array.

Page 79: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 84

Implementation of dequeue

public String dequeue() { if (empty()) throw new IllegalStateException(); else { size --; // Remove from front String value = q[front]; // Facilitate garbage collection q[front] = null; // Update front front++; if (front == q.length) front = 0 ; return value; } }

Page 80: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 85

Linked Implementation of Queues

Page 81: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 86

Linked Implementation of Queues

• A linked list can be used to implement a queue.

• The head of the linked list is used as the front of the queue.

• The end of the linked list is used as the rear of the queue.

Page 82: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 87

Linked Implementation of a Queue

class LinkedQueue

{

private class Node

{

String element;

Node next;

Node(String e, Node n)

{

element = e; next = n;

}

}

Node front = null; // head of list, where items are removed

Node rear = null; // last node in list, where items are added

}

Page 83: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 88

Checking if Queue is Empty

This is done by looking to see if there is a node

at front, that is, if front is null:

boolean empty()

{

return front = null;

}

Page 84: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 89

Linked Implementation of Enqueue

public void enqueue(String s) { if (rear != null) { rear.next = new Node(s, null); rear = rear.next; } else { rear = new Node(s, null); front = rear; } }

Page 85: Chapter 21 : Stacks and Queues - abacus2.gcsu.eduabacus2.gcsu.edu/classes/3410/lectures/ch21-Stacks-and-Queues.pdf · Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Copyright © Pearson Education, Inc. Publishing as Pearson Addison-Wesley 90

Linked Implementation of dequeue

public String dequeue() { if (empty()) throw new IllegalStateException(); else { String value = front.element; front = front.next; if (front == null)

rear = null; return value; } }