#!/usr/bin/python3
# ==================================================================
# From: www.youtube.com/watch?v=T7CapM-xGaU
# determine if parenthesis are balanced
#
# Use a stack to check whether or not a string
# has balanced parentheses.
#
# Example:
# (), ()(), {{{[]}}} <-- balanced
# ()), {{{}}], [][]] <-- not balanced
#
# ==================================================================
class Stack():
'''Stach datas structure'''
def __init__(self):
self.items = []
def push(self,item):
self.items.append(item)
def pop(self):
return self.items.pop()
def is_empty(self):
return self.items == []
def peek(self):
if not self.is_empty():
return self.ittems[-1]
def get_stack(self):
return self.items
def is_match(p1,p2):
'''Test if open and close parentheses match'''
if p1 == "(" and p2 == ")":
return True
elif p1 == "{" and p2 == "}":
return True
elif p1 == "[" and p2 == "]":
return True
else:
return False
def are_parens_balanced(paren_string):
'''does string contain bananced parentheses'''
s = Stack()
is_balanced = True
index = 0
while index < len(paren_string) and is_balanced:
paren = paren_string[index] # get char from string
##print("paren[{}] = {}".format(index,paren))
if paren in "({[": # open parenthesis
s.push(paren)
elif not paren in ")}]": # ignore non-close parenthesis
pass
else: # test for a matching close parenthesis
if s.is_empty():
is_balanced = False
else:
top = s.pop() # get top of stack
if not is_match(top,paren):
is_balanced = False
index += 1
##print("stack = {}".format(s.get_stack()))
if s.is_empty() and is_balanced:
return True
else:
return False
# ------------------------------------------------------------------
# main
# ------------------------------------------------------------------
strs = [ "()()[]{}", # balanced
"((([{{}}])))", # balanced
"()([]{}", # not balanced
"((([{{}])))", # not balanced
"abc(xyz[olp]qsr)asd" # balanced
]
for s in strs:
b = are_parens_balanced(s)
if b:
print("balanced {}".format(s))
else:
print("not balanced {}".format(s))