29
Lecture Objectives To understand how Java implements a stack To learn how to implement a stack using an underlying array or linked list Implement a simple calculator CS340 1

Lecture Objectives To understand how Java implements a stack To learn how to implement a stack using an underlying array or linked list Implement

Embed Size (px)

DESCRIPTION

Implementing a Stack as an Extension of Vector  Part of the package java.util : public class Stack extends Vector  Vector: a growable array of objects CS340 3

Citation preview

Page 1: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

1

Lecture Objectives To understand how Java implements a

stack To learn how to implement a stack using

an underlying array or linked list Implement a simple calculator

Page 2: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

2 Implementing a Stack

Click icon to add picture

CS340

Page 3: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

3

Implementing a Stack as an Extension of Vector

Part of the package java.util :public class Stack<E> extends Vector<E>

Vector: a growable array of objects

Page 4: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

4

Implementing a Stack as an Extension of Vector (cont.)

We can use Vector's add method to implement push:public E push(obj E) { add(obj); return obj;}

pop can be coded aspublic E throws EmptyStackException { try {return remove (size() – 1); } catch (ArrayIndexOutOfBoundsException ex) {throw new EmptyStackException(); }}

Page 5: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

5

Implementing a Stack as an Extension of Vector (cont.)

All of Vector operations can be applied to a Stack Such as searches and access by index

This violates the principle of information hiding

Page 6: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

6

A little about information hiding Principle:

Hide internal details of a component from other components

Why? Prevent damage from wrong external code Make components easier to understand/use Simplify modification and repair Facilitate re-use

Page 7: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

7

Implementing a Stack with a List Component

ListStack: has a List component We can use ArrayList, Vector, or the LinkedList

classes to implement the List interface. push method:

public E push(E obj) { theData.add(obj); return obj;}

Adapter class: stack in this case is adapter class of List

Method delegation: from stack to list

Page 8: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

Implementing a Stack with a List Component (cont.)

public class ListStack<E> implements Stack<E>{ private List<E> theData; public ListStack( ) { theData = new ArrayList<E>(); } @Override public E push( E obj ) { theData.add(obj);

return obj; }CS340

8

Page 9: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

9

Implementing a Stack with a List Component (cont.)

@Override public E pop( ) { if( empty( ) ) throw new EmptyStackException( "ListStack pop" ); return theData.remove(theData.size()-1); } @Override public E peek( ) { if( empty( ) ) throw new EmptyStackException( "ListStack top" ); return theData.get(theData.size()-1); }

Page 10: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

Implementing a Stack with a List Component (cont.)@Override public boolean empty( ) { return(theData.size() == 0); }

CS340

10

Page 11: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

11

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;

@SupressWarnings("unchecked") public ArrayStack() { theData = (E[])new Object[INITIAL_CAPACITY]; }

Allocate storage for an array with a default

capacity

Keep track of the top of the stack

We do not need a size variable or method

Page 12: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

12

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

0

Character

value = 'J'

1

Character

value = 'a'

Character

value = 'v'

2

Character

value = 'a'

3

Page 13: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

13

Implementing a Stack Using an Array (cont.)

@Overridepublic E pop() { if (empty()) { throw new EmptyStackException(); } return theData[topOfStack--];}

This implementation is O(1)

Page 14: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

14

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

Page 15: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

Implementing a Stack as a Linked Data Structure (cont.)

CS340

15

public class LinkedStack<E> implements Stack<E>{// Data fieldsPrivate Node<E> topOfStackRef = null;// Methods: push, pop, peek, empty

}

Page 16: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

16

Comparison of Stack Implementations

Extending a Vector: poor choice for stack implementation

The easiest implementation uses a List component (ArrayList is the simplest) for storing data Array requires reallocation of space when the

array becomes full, and Linked data structure requires allocating

storage for links All insertions and deletions occur at one

end: constant time, O(1)

Page 17: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

17 Additional Stack Applications

Click icon to add picture

CS340

Page 18: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

18

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 or worry about operator precedence

Page 19: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

19

Evaluating Postfix Expressions

Write a class that evaluates a postfix expression

Use the space character as a delimiter between tokens

Page 20: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

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 character 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 operation10. push the result onto the stack11. pop the stack and return the result

7 -20*4

44

Page 21: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

21

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 character 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 operation10. push the result onto the stack11. pop the stack and return the result

7 -20*4

44 77

4

Page 22: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

22

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 character 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 operation10. push the result onto the stack11. pop the stack and return the result

7 -20*44 77

4

4 * 7

Page 23: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

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 character 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 operation10. push the result onto the stack11. pop the stack and return the result

7 -20*44 72828

Page 24: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

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 character 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 operation10. push the result onto the stack11. pop the stack and return the result

7 -20*44 728

2020

28

Page 25: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

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 character 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 operation10. push the result onto the stack11. pop the stack and return the result

7 -20*44 720

28

28 - 20

Page 26: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

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 character 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 operation10. push the result onto the stack11. pop the stack and return the result

7 -20*44 788

Page 27: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

27

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 number 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 operation10. push the result onto the stack11. pop the stack and return the result

7 -20*44 78

Page 28: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

Evaluating Postfix Expressions (cont.)

CS340

28

Listing 3.6 (PostfixEvaluator.java, pages 173 - 175)

Page 29: Lecture Objectives  To understand how Java implements a stack  To learn how to implement a stack using an underlying array or linked list  Implement

CS340

29

Evaluating Postfix Expressions (cont.)

Testing: write a driver which creates a PostfixEvaluator object reads one or more expressions and report the result catches PostfixEvaluator.SyntaxErrorException exercises each path by using each operator exercises each path through the method by trying

different orderings and multiple occurrences of operators tests for syntax errors:

an operator without any operands a single operand an extra operand an extra operator a variable name the empty string