Stacks Lists are great, but Lists are simply collections of items - - PowerPoint PPT Presentation

stacks lists are great but
SMART_READER_LITE
LIVE PREVIEW

Stacks Lists are great, but Lists are simply collections of items - - PowerPoint PPT Presentation

Stacks Lists are great, but Lists are simply collections of items Useful, but nice to have some meaning to attach to them Restrict operations to create useful data structures We want to have ADTs that actually do something


slide-1
SLIDE 1

Stacks

slide-2
SLIDE 2

Stacks

2 CMPS 12B, UC Santa Cruz

Lists are great, but…

Lists are simply collections of items

Useful, but nice to have some meaning to attach to them Restrict operations to create useful data structures

We want to have ADTs that actually do something

useful

Example (from text): collecting characters on a line of text Example: doing math with operator precedence (more on

this later)

Example: matching braces

Both of these applications can use a stack

A stack is also an ADT! Stacks can be based on (abstract) lists!

slide-3
SLIDE 3

Stacks

3 CMPS 12B, UC Santa Cruz

What is a stack?

A stack is a data structure

that keeps objects in Last- In-First-Out (LIFO) order

Objects are added to the top

  • f the stack

Only the top of the stack can

be accessed

Visualize this like a stack of

paper (or plates)

Example: function call

return stack

What methods does a stack

need?

j a v a x c

j a v a x c

slide-4
SLIDE 4

Stacks

4 CMPS 12B, UC Santa Cruz

What methods are needed for a stack?

Create a stack Determine whether a stack is empty (or how many

items are on it)

Add an object to the top of the stack (push) Remove an object from the top of the stack (pop)

Does this return the object removed?

Remove all of the objects from the stack

Can be done by repeatedly calling pop until the stack is

empty

Retrieve the object from the top of the stack (peek)

slide-5
SLIDE 5

Stacks

5 CMPS 12B, UC Santa Cruz

Stack example: matching braces and parens

Goal: make sure left and

right braces and parentheses match

This can’t be solved with

simple counting

{ (x) } is OK, but { (x} ) isn’t

Rule: { ok string } is OK Rule: ( ok string ) is OK Use a stack

Place left braces and

parentheses on stack

When a right brace / paren is

read, pop the left off stack

If none there, report an error

(no match)

slide-6
SLIDE 6

Stacks

6 CMPS 12B, UC Santa Cruz

Stack example: postfix notation

HP calculators use postfix notation (as do some

human languages)

Operations are done by specifying operands, then the

  • perator

Example: 2 3 4 + * results in 14

Calculates 2 * (3 + 4)

We can implement this with a stack

When we see a operand (number), push it on the stack When we see an operator

Pop the appropriate number of operands off the stack Do the calcuation Push the result back onto the stack

At the end, the stack should have the (one) result of the

calculation

slide-7
SLIDE 7

Stacks

7 CMPS 12B, UC Santa Cruz

More on postfix notation

Calculate 5 * (4 + 3) Numbers orderer 5 4 3 Operands ordered + *

Note reverse order! Must compute + first!

See example at right

5 5 4 4 3 3 + 4 3 + 7 * 5 7 * 35

slide-8
SLIDE 8

Stacks

8 CMPS 12B, UC Santa Cruz

Postfix is nice, but infix is more common

Postfix works if you’re used to HP calculators Most people are more used to infix

Example: (8*4) + 5

Can we convert infix to postfix?

Yes! Use a stack to do this…

Observations

Operands stay in the same order from infix to postfix Operator x moves “to the right” to ensure that x precedes

any operands that it should

slide-9
SLIDE 9

Stacks

9 CMPS 12B, UC Santa Cruz

How is this done?

Use two stacks

One for operators being reordered One for the actual postfix operations

Rules are

Operands always pushed onto the postfix stack “(“ pushed onto reorder stack For each operator

Pop off reorder stack and push onto postfix stack until empty or

“(“ or lower precedence operator

Push operator onto postfix stack

On “)”, pop off reorder stack until “(“ is found

Delete “(“: postfix needs no parentheses

At end of string, pop all off reorder stack and onto postfix

stack

slide-10
SLIDE 10

Stacks

10 CMPS 12B, UC Santa Cruz

Example reordering: a-(b+c*d)/e

  • a

Reorder stack Postfix stack

( b + c * d c*d b+c*d / e (b+c*d)/e a-(b+c*d)/e

  • Operands always pushed onto the

postfix stack

  • “(“ pushed onto reorder stack
  • For each operator

Pop off reorder stack and push

  • nto postfix stack until empty or

“(“ or lower precedence operator

Push operator onto postfix stack

  • On “)”, pop off reorder stack

until “(“ is found

Delete “(“: postfix needs no

parentheses

  • At end of string, pop all off

reorder stack and onto postfix stack

  • Here, do operations rather than

push operators onto postfix stack

slide-11
SLIDE 11

Stacks

11 CMPS 12B, UC Santa Cruz

Using interfaces to declare a stack

Java has good support for abstract data types

An interface is a Java class without any methods Classes may implement interfaces

Example: StackInterface

May be implemented by array, linked list, etc. We’ll go over implementation on Friday

For now, useful to see how to declare functions

using interfaces

slide-12
SLIDE 12

Stacks

12 CMPS 12B, UC Santa Cruz

Interfaces and ADTs

pub l i c i n te r f ace S tackADT { pub l i c i n tl eng th ( ) ; pub l i c vo id popA l l( ) ; pub l i c vo id push (Ob jec t

  • )

; pub l i c Ob jec t pop ( ) t h rows S tackExcep t i

  • n

; pub l i c Ob jec t peek ( ) t h rows S tackExcep t i

  • n

; } pub l i c c l ass S tackExcep t i

  • n

ex tends RunT imeExcep t i

  • n{

… } pub l i c c l ass S tackAr ray imp lemen ts S tackADT { f i na l i n t MAX_STACk = 50 ; p r i va te Ob jec t i t ems [ ] ; p r i va te i n tt

  • p

; pub l i c S tackAr ray( ) { / / cons t ruc to r } pub l i c i n tl eng th ( ) { r e tu rn ( t

  • p+1

) ; } … }

slide-13
SLIDE 13

Stacks

13 CMPS 12B, UC Santa Cruz

OK, so stacks are useful

Stacks have many uses

Arithmetic Language parsing Keeping track of recursion (more in this in a week or so)

How can stacks be implemented?

Using a generic List class

Works fine, easy to do May not be as efficient

Using an array directly Using a linked list

Tradeoff between generic and tailored implementations

Generic implementation: simple, quick Tailored implementation: often more efficient

slide-14
SLIDE 14

Stacks

14 CMPS 12B, UC Santa Cruz

Review: methods needed for stacks

Stacks need six methods

Create: make a new stack Push: add an element to the top of the stack Pop: remove an element from the top of the stack Peek: examine the element on the top of the stack PopAll: remove all the elements from the stack IsEmpty: return true if the stack has no elements

Implement these methods using

Methods existing for a list Operations on an array Linked list operations directly

slide-15
SLIDE 15

Stacks

15 CMPS 12B, UC Santa Cruz

Stack using a (generic) list

pub l i c c l ass S tackL i s t{ p r i va te L i s t l ; i n ts i ze ; pub l i c S tackL i s t( ) { l = new L i s t ( ) ; s i ze = ; } pub l i c vo i d push (Ob jec t i t em) { l . i n se r t ( i t em , ) ; s i ze++ ; } pub l i c Ob jec t pop ( ) { Ob jec t i t em = l . i ndex (0 ) ; l . de l e te ( ) ; s i ze

  • ;

r e t u rn ( i t em) ; } pub l i c Ob jec t peek ( ) { r e t u rn ( l . i ndex (0 ) ) ; } pub l i c boo lean i sEmp ty( ) { r e t u rn ( s i ze == ) ; } pub l i c vo i d popA l l( ) { wh i l e ( ! i sEmp ty ( ) ) { pop ( ) ; } } }

slide-16
SLIDE 16

Stacks

16 CMPS 12B, UC Santa Cruz

Issue: what about empty lists?

All this works well if we call pop() with things on

the stack

What if we call pop() on an empty stack?

This has no reasonable result! Need to indicate an error somehow

Solution #1: return a special value

Return null if there’s an error Problem: always checking for null! This approach usually taken in C

Solution #2: generate an exception

slide-17
SLIDE 17

Stacks

17 CMPS 12B, UC Santa Cruz

What’s an exception?

An exception is an abnormal condition

Null reference dereferenced File not found Stack is empty when pop() called

Exceptions can be dealt with in two ways

Handle exception locally Pass it to the calling method

Pass to calling method

Must declare that method can cause an exception:

public Object pop() throws StackException {…}

Calling method must deal with it now!

slide-18
SLIDE 18

Stacks

18 CMPS 12B, UC Santa Cruz

How can an exception be “caught”?

  • Often useful to “catch” an

exception

Deal with the problem Try an alternate way of doing

things

  • Exceptions can be caught with a

“try…catch” block

Different exceptions can be

caught separately

Not all exceptions need be

caught

  • Exceptions are objects

May have methods May carry information about the

error condition

t r y { mys tack .pop ( ) ; } ca t ch (S tackExcep t i

  • n e

) { p r i n t l n( “Emp ty s tack ! ” ) ; } wh i l e ( t r ue ) { t r y { f = new F i l eReade r( name) ; b reak ; } ca t ch ( IOExcep t i

  • n e

) { p r i n t ( “En te r a new name : ” ) ; / / ge t ano the r name } }

slide-19
SLIDE 19

Stacks

19 CMPS 12B, UC Santa Cruz

Stacks with exceptions

pub l i c c l ass S tackL i s t{ p r i va te L i s t l ; i n ts i ze ; pub l i c S tackL i s t( ) { l = new L i s t ( ) ; s i ze = ; } pub l i c Ob jec t peek ( ) { i f ( i sEmp ty ( ) ) { t h row new S tackExcep t i

  • n

( “S tack emp ty ” ) ; } r e t u rn ( l . i ndex (0 ) ) ; } pub l i c vo i d popA l l( ) { wh i l e ( ! i sEmp ty ( ) ) { pop ( ) ; } } pub l i c vo i d push (Ob jec t i t em) { l . i n se r t ( i t em , ) ; s i ze++ ; } pub l i c Ob jec t pop ( ) t h rows S tackExcep t i

  • n{

i f ( i sEmp ty ( ) ) { t h row new S tackExcep t i

  • n

( “S tack emp ty ” ) ; } Ob jec t i t em = l . i ndex (0 ) ; l . de l e te ( ) ; s i ze

  • ;

r e t u rn ( i t em) ; } pub l i c boo lean i sEmpty( ) { r e t u rn ( s i ze == ) ; } }

slide-20
SLIDE 20

Stacks

20 CMPS 12B, UC Santa Cruz

Implementing stacks with arrays

pub l i c c l ass S tackAr ray{ p r i va te Ob jec t a r r [ ] ; i n ts i ze ; p r i va te f i na l i n t max = 20 ; pub l i c S tackL i s t( ) { a r r = new Ob jec t [max ] ; s i ze = ; } pub l i c Ob jec t peek ( ) { i f ( i sEmp ty ( ) ) { t h row new S tackExcep t i

  • n

( “S tack emp ty ” ) ; } r e t u rn (a r r [ s i ze

  • 1

] ) ; } pub l i c vo i d popA l l( ) ; pub l i c boo lean i sEmpty ( ) ; pub l i c vo i d push (Ob jec t i t em) t h rows S tackExcep t i

  • n{

i f ( s i ze >= max ) { t h row new S tackExcep t i

  • n

( “S tack f u l l ” ) ; } a r r [ s i ze++ ] = i t em; } pub l i c Ob jec t pop ( ) t h rows S tackExcep t i

  • n{

i f ( i sEmp ty ( ) ) { t h row new S tackExcep t i

  • n

( “S tack emp ty ” ) ; } r e t u rn (a r r [

  • s

i ze ] ) ; } }

slide-21
SLIDE 21

Stacks

21 CMPS 12B, UC Santa Cruz

Issues with arrays for stacks

Arrays are good for stacks because

Pop and push are easy to implement

Unlike general lists, only need to insert/delete at end

Very space efficient

Only require space for object references No need for extra links

Fast

Some CPUs can do these operations in a single instruction

Downside of using arrays

Stack has a limited size: hard to grow beyond that Entire stack must be allocated even if it’s never used

May be inefficient if maximum size is 1000, but stack never

exceeds 10 elements

Arrays for stacks are very common

slide-22
SLIDE 22

Stacks

22 CMPS 12B, UC Santa Cruz

Implementing stacks with linked lists

pub l i c c l ass S tackAr ray{ p r i va te S tackAr rayNode head ; i n ts i ze ; pub l i c S tackL i s t( ) { head = nu l l ; s i ze = ; } pub l i c Ob jec t peek ( ) { i f ( i sEmp ty ( ) ) { t h row new S tackExcep t i

  • n

( “S tack emp ty ” ) ; } r e t u rn (head .va l ) ; } pub l i c vo i d push (Ob jec t x ) { head = new S tackA r rayNode ( x , head ) ; s i ze++ ; } pub l i c Ob jec t pop ( ) t h rows S tackExcep t i

  • n{

i f ( i sEmp ty ( ) ) { t h row new S tackExcep t i

  • n

( “S tack emp ty ” ) ; } Ob jec t

  • b

j = head .va l ; head = head .nex t ; r e t u rn (ob j ) ; } p r i va te c l ass S tackA r rayNode { pub l i c Ob jec t va l ; pub l i c S tackAr rayNode nex t ; pub l i c S tackAr rayNode (Ob jec t x , S tackAr rayNode n ) { va l = x ; nex t = n ; } }

slide-23
SLIDE 23

Stacks

23 CMPS 12B, UC Santa Cruz

Issues with using linked lists as stacks

Easier to do specific implementation rather than

using generic linked lists

Only need to insert / delete at head No need to move through the list

Implementation is efficient, but not as efficient as

arrays

More space per object (next reference) Slower operations

No preset limit on stack size

slide-24
SLIDE 24

Stacks

24 CMPS 12B, UC Santa Cruz

Example

Let’s implement a stack