1 / 33

CS2006 - Data Structures I

CS2006 - Data Structures I. Chapter 6 Stacks I. Topics. ADT Stack Stack Operations Using ADT Stack Line editor Bracket checking Special-Palindromes Implementation of ADT Stack Using Arrays. Introduction. Stack: Ordered group of homogeneous items

hachi
Télécharger la présentation

CS2006 - Data Structures I

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CS2006 - Data Structures I Chapter 6Stacks I

  2. Topics • ADT Stack • Stack Operations • Using ADT Stack • Line editor • Bracket checking • Special-Palindromes • Implementation of ADT Stack • Using Arrays

  3. Introduction • Stack: • Ordered group of homogeneous items • Only one item can be accessed at a time (top) • Items addition / removal take place only at the top • Inserting an item is known as "pushing" onto the stack. Removing an item is known as "popping" off the stack. • Has Last-In-First-Out (LIFO) behavior

  4. top F top E E D D C C B B bottom bottom A A Stack Of Cups • Add a cup to the stack. • Remove a cup from new stack.

  5. Introduction • Real-life examples: • Trays • Pennies • Folded shirts • Books • . . . • Very useful in computer science • Converting numeric strings into equivalent values • Evaluating algebraic expressions

  6. LIFO • A stack is a LIFO (Last-in-first-out) list top pop push 5 4 5 4 4 4 5 4 3 3 3 3 3 2 2 2 2 2 1 1 1 1 1 stack depth = 5 bottom

  7. Introduction • Example: Line-editor a b c c d d d e   e f f g •  means backspace • will generate the following output: a b c d e f g • Observations

  8. Introduction • Example: Line-editor • Pseudocode: // Read the line, correcting mistakes along the way while (not end of line) { Read a new character ch if ( ch is not a ‘ ‘ ) Add ch to the ADT else Remove the most recently added item from the ADT } // end while

  9. Introduction • Writing the line: • First Draft: // Write the line while (the ADT is not empty) { Remove most recently added item from the ADT Write item ......... } // end while

  10. Introduction • Example: Line-editor • The following operations are needed • Determine if the line is empty • Add a character • Remove the most-recently added character • Retrieve the most recently added item • These are exactly the operations needed for a stack • The ADT Stack can be used to perform the reading and correction of the line

  11. The Stack Interface In Java • We can define our own stack interface like this: public interface StackInterface {public boolean isFull(); // returns if the stack is full public boolean isEmpty(); // return if the stack is emptypublic Object top() // return the top element throws StackException; // if the stack is emptypublic void push(Object obj); // push obj onto the stack public void popAll (); public Object pop() // return and remove the // top element of the stack throws StackException; // if the stack is empty }

  12. Using ADT Stack • Read & Correct a text of line: • Using stack operations +readAndCorrect( out aStack : Stack) // Reads input line and either enters characters onto stack S // or corrects contents if the character is the ‘ ‘ symbol aStack.createStack Read newChar while ( newChar != eoln ) { if ( newChar != ‘ ‘ ) aStack.Push( newChar) else if (! aStack.isEmpty()) aStack.Pop( ) read newChar } // end while

  13. Using ADT Stack • Write Backwards using ADT stack operations: +displayBackward ( in aStack ; Stack) // Displays input line in reverse order by writing // the contents of stack aStack while ( ! aStack.isEmpty ( ) ) { aStack.pop ( newChar ) write newChar } // end while

  14. Stack Application • Example: Balanced Braces • Assumption • All braces are of the same type • Example: a b c { d e f g { i j k } { l { m n } } o p } q r Balanced a b c { d e f } } { g h I j { k l } m Unbalanced

  15. Stack Application • Balanced Braces • Idea: • keep track for unmatched ‘{‘ by pushing them onto a stack • When ‘}’ is encountered , pop one of the unmatched ‘{‘ from the stack • Stop when • The string and stack are both empty  Success • Stack is empty, but string still contains closing braces (‘}‘)  Failure: more closing braces • String is empty but stack still contains unmatched opening braces (‘{‘’)  Failure: more opening braces

  16. Stack Application • Balanced Braces: Pseudocode aStack.createStack ( ) balancedSoFar = true i = 0 while ( balancedSoFar and i < length of aString) { ch = character at position i ++ i if ( ch = ‘{‘) aStack.push( ‘{‘ ) else if ( ch = ‘}’ ) aStack.pop( ) // Pop a matching open brace else balancedSoFar = false // ignore all characters other that braces } // end while if ( balancedSoFar && aStack.isEmpty( ) ) aString has balanced braces else aString doesn’t have balanced braces

  17. Stack Application • Balanced Braces: Examples { a { b } c } { a { b c } { a b } }

  18. Stack Application • How about math expression with 3 types of brackets () [] {}

  19. Stack Application • Algorithm • Scan expression from left to right • Each time a left bracket is encountered, push it onto stack • When a right bracket is encountered, compare it with the top item on the stack • If it is a match, pop the stack • If not, report illegal bracketing • If the stack id prematurely empty, report illegal • If there are items left on the stack after the expression has been scanned, report illegal bracketing

  20. Stack Application • (3+4)*{7+[4/8]}

  21. Stack Application • Special-Palindromes L = { w $ w ' : w is either empty or any string not including $, and w ' = reverse (w) } • Idea: • Traverse the first half and push its elements onto the stack • When $ is reached, ignore it and start traversing and matching each element from the input string with that on the stack • Termination: • Success: • Both stack and string are empty • Failure: • Character on input doesn't match character on stack top • String empty, but stack isn't • Stack empty, but string isn't

  22. Stack Application • Special-Palindromes: Pseudocode using ADT Stack aStack.createStack ( ) // Push characters preceding $ onto stack i = 0 ch = character at position i in string while ( ch != ‘$’) { aStack.Push ( ch ) ++i ch = character at position i in string } // end while ++i // Skip the ‘$ // match the reverse of w inLanguage = true // assume string is in language while ( inLanguage && i < length of aString) try { aStack.pop (StackTop) ch = character at position i in string if ( StackTop = ch ++i // Characters match else inLanguage = false } // end try catch { // pop failed, stack empty (1st half of string shorter than 2nd half inLanguage = false } // end catch If (inLanguage && isEmpty()) aString is in language Else aString is not in language

  23. ADT Stack Implementation • implementations • Arrays • Linked lists • ADT List • Vector

  24. Top 10 20 30 10 20 30 Top 10 20 30 ADT Stack Implementation Array Linked List ADT List Top

  25. An Array-Based Stack • We can use arrays for our stacks by requiring a maximum size N for our stack (e.g. N = 50) • The stack would then consist of an N-element array, s, and the array index of the top element, t • Array indices start at 0,so we will initialize t to -1 • Pseudo-code: int size(): return t +1 boolean isEmpty(): return t < 0 Object top(): if isEmpty() then throw StackEmptyException else return s [t ]

  26. Stack Interface public interface StackInterface { public boolean isEmpty(); public boolean isFull(); public void push(Object newItem) throws StackException; public Object pop() throws StackException; public void popAll(); public Object peek() throws StackException; } // end StackInterface

  27. Stack Exception public class StackException extends java.lang.RuntimeException { public StackException(String s) { super(s); } // end constructor } // end StackException

  28. Array Stack Implementation (1) public class ArrayStackBased implements StackInterface { final int MAX_STACK = 50; // maximum size of stack private Object items[ ]; private int top; public ArrayStackBased() { items = new Object[MAX_STACK]; top = -1; } // end default constructor public boolean isEmpty() { return top < 0; } // end isEmpty public boolean isFull() { return top == MAX_STACK-1; } // end isFull

  29. Array Stack Implementation (2) public void push(Object newItem) throws StackException { if (!isFull()) { items[++top] = newItem; } else { throw new StackException("StackException on " + "push: stack full"); } // end if } // end push public void popAll() { items = new Object[MAX_STACK]; top = -1; } // end popAll

  30. Array Stack Implementation (3) public Object pop() throws StackException { if (!isEmpty()) { return items[top--]; } else { throw new StackException("StackException on " + "pop: stack empty"); } // end if } // end pop public Object peek() throws StackException { if (!isEmpty()) { return items[top]; } else { throw new StackException("Stack exception on " + "peek - stack empty"); } // end if } // end peek } // end ArrayStack

  31. Array Stack Test public class ArrayStackTest { public static final int MAX_ITEMS = 15; public static void main(String[ ] args) { ArrayStackBased stack = new ArrayStackBased(); Integer items[ ] = new Integer[MAX_ITEMS]; System.out.println("Pushing:"); for (int i=0; i<MAX_ITEMS; i++) { items[i] = new Integer(i); if (!stack.isFull()) { System.out.print(" "+i); stack.push(items[i]); } // end if } // end for System.out.println("\nPopping:"); while (!stack.isEmpty()) { // cast result of pop to Integer System.out.print(" "+(Integer)(stack.pop())); } // end while System.out.println(); } // end main } // end ArrayStackTest

  32. Array Stack Test Output Pushing: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Popping: 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

  33. Array Stack • Questions: • Can we push/pop primitive type value onto the stack? • Can we push/pop different objects onto the stack? Student Car • How to access each object

More Related