The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The...
Transcript of The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The...
![Page 1: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/1.jpg)
The Art of Data Structures Stacks
Richard E Sarkis CSC 162: The Art of Data Structures
![Page 2: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/2.jpg)
Class Administrivia
![Page 3: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/3.jpg)
Agenda
• What is a Stack?
• The Stack Abstract Data Type
• Implementing a Stack in Python
• Simple Balanced Parentheses
• Balanced Symbols (A General Case)
• Converting Decimal Numbers to Binary Numbers
• Infix, Prefix and Postfix Expressions
![Page 4: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/4.jpg)
Linear Data Structures
![Page 5: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/5.jpg)
Linear Data Structures What are they?
• Data collections where items are ordered depending on how they are added/removed
• They stay in that order, relative to other elements before and after it
• Two ends (left, right, top, bottom, front, rear, etc…)
• Adding and removing is the distinguishing characteristic
• May be limited in what end data is removed
![Page 6: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/6.jpg)
Linear Data Structures What are they?
• Simple, but powerful data structures will be covered
• Stacks, Queues, Deques, and Lists
• Very useful in computer science
• Appear in many algorithms, and solve important problems
![Page 7: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/7.jpg)
Stacks
![Page 8: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/8.jpg)
Stacks Definition
• Also known as a "push-down stack"
• Ordered collection where items are added, or removed from the same end
• This means the last item added is the first one removed, also called a LIFO (last-in, first-out)
• Temporally, the newest items are at the top/front and the oldest items are in the bottom/rear
![Page 9: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/9.jpg)
Stacks A Stack of Books
Stacks
What is a Stack?The Stack Abstract Data TypeImplementing a Stack in PythonSimple Balanced ParenthesesBalanced Symbols (A General Case)Converting Decimal Numbers to Binary NumbersInfix, Prefix and Postfix Expressions
A Stack of Books
History
Music
Physics
Calculus
Python
Basic Data Structures
![Page 10: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/10.jpg)
Stacks A Stack of Primitive Python Objects
Stacks
What is a Stack?The Stack Abstract Data TypeImplementing a Stack in PythonSimple Balanced ParenthesesBalanced Symbols (A General Case)Converting Decimal Numbers to Binary NumbersInfix, Prefix and Postfix Expressions
A Stack of Primitive Python Objects
4
True
8.4
“dog"
Top
Base
Basic Data Structures
![Page 11: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/11.jpg)
Stacks The Reversal Property of Stacks
Stacks
What is a Stack?The Stack Abstract Data TypeImplementing a Stack in PythonSimple Balanced ParenthesesBalanced Symbols (A General Case)Converting Decimal Numbers to Binary NumbersInfix, Prefix and Postfix Expressions
The Reversal Property of Stacks
4
True
8.4
"dog"
4"dog"8.4 True 4 "dog" True 8.4
Original Order Reversed Order
last
first
first
last
Basic Data Structures
![Page 12: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/12.jpg)
Implementation
![Page 13: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/13.jpg)
Implementation Stack Abstract Data Type
• The stack abstract data type is defined by:
• The underlying data structure
• The exposed actions that operate on it
• Items are removed, and added from the end called the "top"
• They are an ordered LIFO
![Page 14: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/14.jpg)
Implementation Stack Abstract Data Type
• When an ADT is given a physical implementation, we refer to that implementation as a data structure
• We will be using Python classes to implement this ADT, where the stack operations will be methods
• A Python list will be the underlying data structure, as it is a powerful, and simply primitive collection structure
![Page 15: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/15.jpg)
Implementation Stack Operations
•Stack() creates a new stack that is empty; it needs no parameters and returns an empty stack
•push(item) adds a new item to the top of the stack; it needs the item and returns nothing
•pop() removes the top item from the stack; it needs no parameters, returns the item and the stack is modified
![Page 16: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/16.jpg)
Implementation Stack Operations
•peek() returns the top item from the stack but does not remove it; it needs no parameters; the stack is not modified
•is_empty() tests to see whether the stack is empty; it needs no parameters and returns a boolean value
•size() returns the number of items on the stack. It needs no parameters and returns an integer
![Page 17: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/17.jpg)
Implementation Stack Operations
Stack Operation Stack Contents Return Values.is_empty() [] TRUEs.push(4) [4]s.push('dog') [4, 'dog']s.peek() [4, 'dog'] dog's.push(True) [4, 'dog', True]s.size() [4, 'dog', True] 3s.is_empty() [4, 'dog', True] FALSEs.push(8.4) [4, 'dog', True, 8.4]s.pop() [4, 'dog', True] 8.4s.pop() [4, 'dog'] TRUEs.size() [4, 'dog'] 2
![Page 18: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/18.jpg)
Implementation Stack Implementation in Python
class Stack: def __init__(self): self.items = []
def is_empty(self): return self.items == []
def push(self, item): self.items.append(item)
def pop(self): return self.items.pop()
def peek(self): return self.items[-1]
def size(self): return len(self.items)
![Page 19: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/19.jpg)
Implementation Alternate Implementation
• The abstract nature of an ADT can allow us to change the underlying physical implementation without affecting the logical characteristics
• The performance, however, may differ wildly
• The following alternate implementation will have push() and pop() methods that run in O(n), for a stack of size n
![Page 20: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/20.jpg)
Implementation Stack Implementation in Python
(Alternate, Slower)class Stack: def __init__(self): self.items = []
def is_empty(self): return self.items == []
def push(self, item): self.items.insert(0, item)
def pop(self): return self.items.pop(0)
def peek(self): return self.items[0]
def size(self): return len(self.items)
![Page 21: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/21.jpg)
Simple Balanced Parentheses
![Page 22: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/22.jpg)
Simple Balanced Parentheses Matching ParenthesesStacks
What is a Stack?The Stack Abstract Data TypeImplementing a Stack in PythonSimple Balanced ParenthesesBalanced Symbols (A General Case)Converting Decimal Numbers to Binary NumbersInfix, Prefix and Postfix Expressions
Matching Parentheses
( ( ) ( ( ) ) ( ) )
Most recent open matches first close
First open may wait until last close
Basic Data Structures
![Page 23: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/23.jpg)
Simple Balanced Parentheses Parentheses Checker
def par_checker(symbol_string): s = Stack() balanced = True index = 0 while index < len(symbol_string) and balanced: symbol = symbol_string[index] if symbol == "(": s.push(symbol) else: # the case for a right/closing parens if s.is_empty(): balanced = False else: s.pop() index += 1 if balanced and s.is_empty(): return True else: return False
![Page 24: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/24.jpg)
Simple Balanced Parentheses Parentheses Checker
• That could have been done more easily with just a counter
• If we extend to handle brackets and braces, too, we really need the stack…
![Page 25: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/25.jpg)
Balanced Symbols (A General Case)
![Page 26: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/26.jpg)
Balanced Symbols (A General Case)
def symbol_checker(symbol_string): s = Stack() balanced = True index = 0 while index < len(symbol_string) and balanced: symbol = symbol_string[index] if symbol in '([{<': s.push(symbol) else: if s.is_empty(): balanced = False else: top = s.pop() print(s.items, top, symbol) if not matches(top, symbol): balanced = False index += 1 return (balanced and s.is_empty())
![Page 27: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/27.jpg)
Balanced Symbols (A General Case)
def matches(_open, close): openers = "([{<" closers = ")]}>" return openers.index(_open) == closers.index(close)
print(par_checker('{{([][])}()}')) print(par_checker('[{()]'))
![Page 28: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/28.jpg)
Converting Decimal Numbers to Binary Numbers
![Page 29: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/29.jpg)
Converting Dec-to-Binary Visualization
Stacks
What is a Stack?The Stack Abstract Data TypeImplementing a Stack in PythonSimple Balanced ParenthesesBalanced Symbols (A General Case)Converting Decimal Numbers to Binary NumbersInfix, Prefix and Postfix Expressions
Decimal-to-Binary Conversion
233 / 2 = 116 rem = 1
116 / 2 = 58 rem = 0
58 / 2 = 29 rem = 0
29 / 2 = 14 rem = 1
14 / 2 = 7 rem = 0
7 / 2 = 3 rem = 1
3 / 2 = 1 rem = 1
1/ 2 = 0 rem = 11
0
0
1
0
1
1
1
push
rem
aind
ers
pop remainders
Basic Data Structures
![Page 30: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/30.jpg)
Converting Dec-to-Binary Python Implementation
def to_binary(dec_num): remstack = Stack() while dec_num > 0: # either a zero or one result rem = dec_num % 2 remstack.push(rem) dec_num = dec_num // 2 bin_string = "0b" while not remstack.is_empty(): bin_string += str(remstack.pop()) # pops an 'int' value, which we convert to a str return bin_string
![Page 31: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/31.jpg)
Converting Dec-to-Binary Conversion to Any Numerical Base
def to_base_n(dec_num, base): digits = "0123456789ABCDEF" remstack = Stack() while dec_num > 0: rem = dec_num % base remstack.push(rem) dec_num //= base new_str = "" while not remstack.is_empty(): val = remstack.pop() print(val, digits[val]) new_str += digits[val] return new_str
![Page 32: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/32.jpg)
Converting Dec-to-Binary Conversion to Any Base
• How would this look if we wrote this as a Python class?
![Page 33: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/33.jpg)
Infix, Prefix, Postfix Exps.
![Page 34: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/34.jpg)
Infix, Prefix, Postfix Exps. Moving Operators Rightward for Postfix
Notation
• We're used to infix: A + B
• We're also used to prefix, perhaps with parentheses:
• add(A, B)
• + A B
•
Stacks
What is a Stack?The Stack Abstract Data TypeImplementing a Stack in PythonSimple Balanced ParenthesesBalanced Symbols (A General Case)Converting Decimal Numbers to Binary NumbersInfix, Prefix and Postfix Expressions
Moving Operators to the Right for Postfix Notation
( A + ( B * C ) )
Basic Data Structures
![Page 35: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/35.jpg)
Infix, Prefix, Postfix Exps. Moving Operators Leftward for Postfix
Notation
• Postfix may seem a little strange: A B +
Stacks
What is a Stack?The Stack Abstract Data TypeImplementing a Stack in PythonSimple Balanced ParenthesesBalanced Symbols (A General Case)Converting Decimal Numbers to Binary NumbersInfix, Prefix and Postfix Expressions
Moving Operators to the Left for Prefix Notation
( A + ( B * C ) )
Basic Data Structures
![Page 36: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/36.jpg)
Infix, Prefix, Postfix Exps. Converting a Complex Expression to Prefix
and Postfix Notations
Stacks
What is a Stack?The Stack Abstract Data TypeImplementing a Stack in PythonSimple Balanced ParenthesesBalanced Symbols (A General Case)Converting Decimal Numbers to Binary NumbersInfix, Prefix and Postfix Expressions
Converting a Complex Expression to Prefix andPostfix Notations
(A + B) * C - (D - E) * (F + G)
(((A + B) * C) - ((D - E) * (F + G)))
A B + C * D E - F G + * -- * + A B C * - D E + F G
PostfixPrefix
Basic Data Structures
![Page 37: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/37.jpg)
Infix, Prefix, Postfix Exps. Converting a Complex Expression to Prefix
and Postfix Notations
• With infix, we need parentheses to determine order of operations
• We sometimes leave them out if the order can be implied by rules for precedence:
• 2 + 3 * 4 == 2 + (3 * 4) ==> 14
• 2 + 3 * 4 == (2 + 3) * 4 ==> 20
![Page 38: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/38.jpg)
Infix, Prefix, Postfix Exps. Converting a Complex Expression to Prefix
and Postfix Notations
• We sometimes leave them out if the order can be implied by rules for associativity:
• 10 - 4 - 3 == (10 - 4) - 3 ==> 3
• 10 - 4 - 3 == 10 - (4 - 3) ==> 9
![Page 39: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/39.jpg)
Infix, Prefix, Postfix Exps. Converting a Complex Expression to Prefix
and Postfix Notations
• Prefix and postfix have no need for parentheses; the order is manifest
• M&R point out that this is because we've effectively placed the operator in the position of the left or right paren, so it implies the grouping
![Page 40: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/40.jpg)
Infix, Prefix, Postfix Exps. Converting a Complex Expression to Prefix
and Postfix Notations
• ( A + ( B * C ) ) ← infix
• + A * B C ← prefix
• A B C * + ← postfix
• Or…
![Page 41: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/41.jpg)
Infix, Prefix, Postfix Exps. Converting a Complex Expression to Prefix
and Postfix Notations
• ( ( A + B ) * C ) ← infix
• * + A B C ← prefix
• A B + C * ← postfix
![Page 42: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/42.jpg)
Infix, Prefix, Postfix Exps. Converting a Complex Expression to Prefix
and Postfix Notations
• So what does this have to do with stacks?
• We can build on the balanced parens example to convert among the three representations and to evaluate expressions in any of the three notations
• Compilers and interpreters (like the Python interpreter) do a lot of this sort of thing
![Page 43: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/43.jpg)
Infix, Prefix, Postfix Exps. Converting a Complex Expression to Prefix
and Postfix Notations
• We'll show to infix to postfix conversions
• One handles precedence, the other does not
• Both have left associativity
• Neither example handles right associativity (e.g., for exponentiation)
![Page 44: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/44.jpg)
Infix, Prefix, Postfix Exps. Infix to Postfix Notation (No Precedence)
import string
def infix_to_postfix(infix_expr): operand_stack = Stack() postfix_list = [] token_list = infix_expr.split() for token in token_list: if token in string.ascii_uppercase: postfix_list.append(token) elif token == '(': operand_stack.push(token) elif token == ')': top_token = operand_stack.pop() while top_token != '(': postfix_list.append(top_token) top_token = operand_stack.pop() else: # Operator if not operand_stack.is_empty() and operand_stack.peek() != '(': postfix_list.append(operand_stack.pop()) operand_stack.push(token) while not operand_stack.is_empty(): postfix_list.append(operand_stack.pop()) return "".join(postfix_list)
![Page 45: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/45.jpg)
Infix, Prefix, Postfix Exps. Converting A * B + C * D to Postfix
Notation
1. The following algorithm handles precedence; still implicitly left associative
2. Create an empty stack called opstack for keeping operators
3. Create an empty list for output
4. Convert the input infix string to a list by using the string method split
![Page 46: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/46.jpg)
Infix, Prefix, Postfix Exps. Converting A * B + C * D to Postfix
Notation
4. Scan the token list from left to right
• If the token is an operand, append it to the end of the output list
• If the token is a left parenthesis, push it on the opstack
![Page 47: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/47.jpg)
Infix, Prefix, Postfix Exps. Converting A * B + C * D to Postfix
Notation
4. (cont.) Scan the token list from left to right
• If the token is a right parenthesis, pop the opstack until the corresponding left parenthesis is removed
• Append each operator to the end of the output list
![Page 48: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/48.jpg)
Infix, Prefix, Postfix Exps. Converting A * B + C * D to Postfix
Notation
4. (cont.) Scan the token list from left to right
• If the token is an operator, *, /, +, or -, push it on the opstack
• However, first remove any operators already on the opstack that have higher or equal precedence and append them to the output list
![Page 49: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/49.jpg)
Infix, Prefix, Postfix Exps. Converting A * B + C * D to Postfix
Notation
5. When the input expression has been completely processed, check the opstack
• Any operators still on the stack can be removed and appended to the end of the output list
![Page 50: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/50.jpg)
Infix, Prefix, Postfix Exps. Converting A * B + C * D to Postfix
Notation
Stacks
What is a Stack?The Stack Abstract Data TypeImplementing a Stack in PythonSimple Balanced ParenthesesBalanced Symbols (A General Case)Converting Decimal Numbers to Binary NumbersInfix, Prefix and Postfix Expressions
Converting A * B + C * D to Postfix Notation
A * B + C
++**
* D
+
*
+
A B * C D * +
*
+* +
*
A B * C D * +
A * B + C * D
Basic Data Structures
![Page 51: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/51.jpg)
Infix, Prefix, Postfix Exps. Infix to Postfix Notation (With Precedence)
def infix_to_postfix2(infix_expr): prec = {'*': 3, '/': 3, '+': 2, '-': 2, '(': 1} operand_stack = Stack() postfix_list = [] token_list = infix_expr.split() # our infix_expr should have spaces in it! for token in token_list: if token in string.ascii_uppercase or token in string.digits: postfix_list.append(token) elif token == '(': operand_stack.push(token) elif token == ')': top_token = operand_stack.pop() while top_token != '(': postfix_list.append(top_token) top_token = operand_stack.pop() else: while (not operand_stack.is_empty() and prec[operand_stack.peek()] >= prec[token]): postfix_list.append(operand_stack.pop()) operand_stack.push(token) while not operand_stack.is_empty(): postfix_list.append(operand_stack.pop()) return " ".join(postfix_list)
![Page 52: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/52.jpg)
Infix, Prefix, Postfix Exps. Infix to Postfix Notation (With Precedence)
print(infix_to_postfix2("A * B + C * D")) print(infix_to_postfix2("( A + B ) * C - ( D - E ) * ( F + G )"))
![Page 53: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/53.jpg)
Infix, Prefix, Postfix Exps. Stack Contents During Evaluation
Stacks
What is a Stack?The Stack Abstract Data TypeImplementing a Stack in PythonSimple Balanced ParenthesesBalanced Symbols (A General Case)Converting Decimal Numbers to Binary NumbersInfix, Prefix and Postfix Expressions
Stack Contents During Evaluation
4 5 6 * +
344
30
4
6
5
4
5
4
pushpush push pop twice
and do mathpop twice
and do math
Left to Right Evaluation
Basic Data Structures
![Page 54: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/54.jpg)
Infix, Prefix, Postfix Exps. A More Complex Example of Evaluation
Stacks
What is a Stack?The Stack Abstract Data TypeImplementing a Stack in PythonSimple Balanced ParenthesesBalanced Symbols (A General Case)Converting Decimal Numbers to Binary NumbersInfix, Prefix and Postfix Expressions
A More Complex Example of Evaluation
7 8 + 3 2
1515
3
157
8
7
+
3
2
/
15
5
3
Basic Data Structures
![Page 55: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/55.jpg)
Infix, Prefix, Postfix Exps. A More Complex Example of Evaluation
1. Create an empty stack called operand_stack
2. Convert the string to a list by using the string method split
![Page 56: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/56.jpg)
Infix, Prefix, Postfix Exps. A More Complex Example of Evaluation
3. Scan the token list from left to right
• If the token is an operand, convert it from a str to an int, then push onto the operand_stack
• If the token is an operator, *, /, +, or -, it will need two operands
• Pop the operand_stack twice
• The first pop is the second operand and the second pop is the first operand
![Page 57: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/57.jpg)
Infix, Prefix, Postfix Exps. A More Complex Example of Evaluation
4. Scan the token list from left to right (cont.)
• The first pop is the second operand and the second pop is the first operand
• Perform the arithmetic operation
• Push the result back on the operand_stack
![Page 58: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/58.jpg)
Infix, Prefix, Postfix Exps. Postfix Evaluation
def postfix_eval(postfix_expr): operand_stack = Stack() # operAND stack token_list = postfix_expr.split() for token in token_list: if token in string.digits: operand_stack.push(int(token)) else: operand2 = operand_stack.pop() operand1 = operand_stack.pop() result = do_math(token, operand1, operand2) # Can you eliminate `do_math` with a one-liner? operand_stack.push(result) return operand_stack.pop()
![Page 59: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/59.jpg)
Infix, Prefix, Postfix Exps. Postfix Evaluation
def do_math(op, op1, op2): if op == '*': return op1 * op2 elif op == '/': return op1 / op2 elif op == '+': return op1 + op2 else: return op1 - op2
print(postfixEval('7 8 + 3 2 + /'))
![Page 60: The Art of Data Structures Stacksrsarkis/csc162/_static/lectures/Stacks.pdf · What is a Stack? The Stack Abstract Data Type Implementing a Stack in Python Simple Balanced Parentheses](https://reader033.fdocuments.in/reader033/viewer/2022042915/5f524ced5a493e3d2730d8fa/html5/thumbnails/60.jpg)
Questions?