class Stack:
'''Implement a stack using list'''
def __init__(self, L=[]):
self.data = L
def push(self, item):
self.data.append(item)
def pop(self):
return self.data.pop()
def peek(self):
return self.data[-1]
def is_empty(self):
return len(self.data) == 0
def size(self):
return len(self.data)
def clear(self):
self.data = []
if __name__ == '__main__':
s = Stack()
s.push(123)
s.push('Hello')
s.push(True)
print('Size of s: ', s.size)
print('Pop an item: ', s.pop())
print('Peek an item:', s.peek())
print('Size of s: ', s.size())
print('Pop an item: ', s.pop())
print('Pop an item: ', s.pop())
print('Size of s: ', s.size())
print('s is empty?: ', s.is_empty())
# Balanced Parentheses Using Stack data structure
from stack import Stack
def BalancedParentheses(strParens):
s = Stack()
for item in strParens:
if item == '(':
s.push(item)
else:
if s.is_empty():
return False
s.pop()
return s.is_empty()
if __name__ == '__main__':
print(BalancedParentheses('(()()()())'))
print(BalancedParentheses('(((()))))'))
print(BalancedParentheses('(()((())())))'))
print(BalancedParentheses('(()()(()())))'))
# A more general brackets matching
from stack import Stack
def balancedSymbol(symStr):
s = Stack()
s.clear() # I'm not sure why this is required
for item in symStr:
if item in '([{':
s.push(item)
else:
if s.is_empty():
return False
else:
top = s.pop()
if not match(top, item):
return False
return s.is_empty()
def match(left, right):
opening = '([{'
closing = ')]}'
return opening.index(left) == closing.index(right)
if __name__ == '__main__':
print(balancedSymbol('(()[])')) # Should be True
print(balancedSymbol('(()[]){{')) # Should be False
print(balancedSymbol('({([])[]})')) # Should be True
print(balancedSymbol('(()[])[{}')) # Should be False