TK1924 Program Design & Problem Solving Session 2011/2012 L5: Stacks Objectives In this chapter, you will: • Learn about stacks • Examine various stack operations • Learn how to implement a stack as an array • Discover stack applications • Learn how to use a stack to remove recursion 2 Stacks • Stack: list of homogenous elements – Addition and deletion occur only at one end, called the top of the stack • Example: in a cafeteria, the second tray can be removed only if first tray has been removed – Last in first out (LIFO) data structure • Operations: – Push: to add an element onto the stack – Pop: to remove an element from the stack 3 Stacks (cont’d.) 4 Stacks (cont’d.) 5 Stack Operations • In the abstract class stackADT: – initializeStack – isEmptyStack – isFullStack – push – top – pop 6 Implementation of Stacks as Arrays • First element can go in first array position, the second in the second position, etc. • The top of the stack is the index of the last element added to the stack • Stack elements are stored in an array • Stack element is accessed only through top • To keep track of the top position, use a variable called stackTop 7 Implementation of Stacks as Arrays (cont'd.) • Because stack is homogeneous – You can use an array to implement a stack • Can dynamically allocate array – Enables user to specify size of the array • The class stackType implements the functions of the abstract class stackADT 8 UML Class Diagram of class stackType 9 Implementation of Stacks as Arrays (cont'd.) • C++ arrays begin with the index 0 – Must distinguish between: • The value of stackTop • The array position indicated by stackTop • If stackTop is 0, the stack is empty • If stackTop is nonzero, the stack is not empty – The top element is given by stackTop - 1 10 Implementation of Stacks as Arrays (cont'd.) 11 Initialize Stack 12 Empty Stack • If stackTop is 0, the stack is empty 13 Full Stack • The stack is full if stackTop is equal to maxStackSize 14 Push • Store the newItem in the array component indicated by stackTop • Increment stackTop • Must avoid an overflow 15 Push (cont'd.) 16 Return the Top Element 17 Pop • Simply decrement stackTop by 1 • Must check for underflow condition 18 Pop (cont’d.) 19 Pop (cont’d.) 20 Copy Stack 21 Constructor 22 Destructor 23 Stack Header File myStack.h – Place definitions of class and functions (stack operations) together in a file 24 Programming Example: Highest GPA • Input: program reads an input file with each student’s GPA and name 3.5 3.6 2.7 3.9 3.4 3.9 3.4 Bill John Lisa Kathy Jason David Jack • Output: the highest GPA and all the names associated with the highest GPA 25 Programming Example: Problem Analysis and Algorithm Design • Read the first GPA and name of the student – This is the highest GPA so far • Read the second GPA and student name – Compare this GPA with highest GPA so far • New GPA is greater than highest GPA so far – Update highest GPA, initialize stack, add to stack • New GPA is equal to the highest GPA so far – Add name to stack • New GPA is smaller than the highest GPA – Discard 26 Programming Example: Problem Analysis and Algorithm Design (cont’d.) 3.5 3.6 2.7 3.9 3.4 3.9 3.4 Bill John Lisa Kathy Jason David Jack 3.9 [99] highestGPA [98] : : [3] maxStackSize 100 [2] stackTop 1 list David [1] Kathy [0] 27 Application of Stacks: Postfix Expressions Calculator • Infix notation: usual notation for writing arithmetic expressions – The operator is written between the operands – Example: a + b – The operators have precedence • Parentheses can be used to override precedence 28 Application of Stacks: Postfix Expressions Calculator (cont'd.) • Prefix (Polish) notation: the operators are written before the operands – Introduced by the Polish mathematician Jan Lukasiewicz • Early 1920s – The parentheses can be omitted – Example: + a b 29 Application of Stacks: Postfix Expressions Calculator (cont'd.) • Reverse Polish notation: the operators follow the operands (postfix operators) – Proposed by the Australian philosopher and early computer scientist Charles L. Hamblin • Late 1950's – Advantage: the operators appear in the order required for computation – Example: a + b * c • In a postfix expression: a b c * + 30 Application of Stacks: Postfix Expressions Calculator (cont'd.) 31 Application of Stacks: Postfix Expressions Calculator (cont'd.) • Postfix notation has important applications in computer science – Many compilers first translate arithmetic expressions into postfix notation and then translate this expression into machine code • Evaluation algorithm: – Scan expression from left to right – When an operator is found, back up to get the operands, perform the operation, and continue 32 Application of Stacks: Postfix Expressions Calculator (cont'd.) • Example: 6 3 + 2 * = 33 Application of Stacks: Postfix Expressions Calculator (cont'd.) • Symbols can be numbers or anything else: – +, -, *, and / are operators • Pop stack twice and evaluate expression • If stack has less than two elements error – If symbol is =, the expression ends • Pop and print answer from stack • If stack has more than one element error – If symbol is anything else • Expression contains an illegal operator 34 Application of Stacks: Postfix Expressions Calculator (cont'd.) • Examples: 7 6 + 3 ; 6 - = • ; is an illegal operator 14 + 2 3 * = • Does not have enough operands for + 14 2 3 + = • Error: stack will have two elements when we encounter equal (=) sign 35 Application of Stacks: Postfix Expressions Calculator (cont'd.) • We assume that the postfix expressions are in the following form: #6 #3 + #2 * = – If symbol scanned is #, next input is a number – If the symbol scanned is not #, then it is: • An operator (may be illegal) or • An equal sign (end of expression) • We assume expressions contain only +, -, *, and / operators 36 Main Algorithm • Pseudocode: • We will write four functions: – evaluateExpression, evaluateOpr, discardExp, and printResult 37 Function evaluateExpression 38 Function evaluateOpr 39 Function evaluateOpr (cont’d.) 40 Function discardExp • This function is called whenever an error is discovered in the expression 41 Function printResult • If the postfix expression contains no errors, the function printResult prints the result – Otherwise, it outputs an appropriate message • The result of the expression is in the stack and the output is sent to a file 42 Function printResult (cont’d.) 43 Nonrecursive Algorithm to Print a Linked List Backward • To print the list backward, first we need to get to the last node of the list – Problem: how do we get back to previous node? • Links go in only one direction – Solution: save a pointer to each of the nodes with info 5, 10, and 15 • Use a stack (LIFO) 44 Nonrecursive Algorithm to Print a Linked List Backward 45 Nonrecursive Algorithm to Print a Linked List Backward • Let us now execute the following statements: • Output: 20 15 10 5 46 Summary • Stack: items are added/deleted from one end – Last In First Out (LIFO) data structure – Operations: push, pop, initialize, destroy, check for empty/full stack – Can be implemented as array or linked list – Middle elements should not be accessed • Postfix notation: operators are written after the operands (no parentheses needed) 47