Function that checks if brackets are balanced in python
Question:
I have written the following code to check if some input to the function contains balanced brackets:
def balanced_brackets(text):
brackets = [ ('(',')'), ('[',']'), ('{','}'),('<','>')]
s = 0
e = 1
st = Stack()
for i in text:
for pair in brackets:
if i == pair[s]:
st.push(i)
elif i == pair[e] and not st.isEmpty() and st.pop() != pair[s]:
return False
if st.isEmpty():
return True
else:
return False
This code is working for input such as ‘()(())()’ but it failed when I tried it for ‘zn()((b)())q())()l()d(r)’. Can anyone help me identify what the problem is? Thanks.
Answers:
Your problem is with the and not st.isEmpty()==0
. When it gets to the unbalanced ')'
, all the previous ones have balanced out, so st is empty.
- If you have a i == pair[e], and your stack is empty, you want to return False.
- You also want to return False if you pop and it isn’t pair[e]. But you don’t want to pop if the stack is empty.
What you have now, in condition 1, just keeps going. You need to change around the condition there so that it accounts for both, or have two elifs. The former can be achieved with some nesting ands and ors.
By the way; unless you want to do something fancy with it, there’s no real need to implement a stack. You can just use a list instead, with l.pop, len(l), and l.append.
This works.It needs a stack module to import. It will keep track of matched pairs.
def multi_bracket_validation(input):
""" test for matching brackets and return bool """
if type(input) is str:
open_b = '({]'
closed_b = ')}]'
compare = Stack()
for brac in input:
if brac in open_b:
compare.push(brac)
elif brac in closed_b:
if compare.top is None:
return False
if closed_b.index(brac) != open_b.index(compare.pop().val):
return False
return compare.top is None
return False
This is one way of doing it:
def check_braces(string:str):
print(string)
braces = [("[","]"), ("{","}"), ("(",")")]
stack = []
for char in string:
for pair in braces:
if char in pair:
if char == pair[0]:
stack.append(pair[1])
elif not stack:
return False
elif char != stack.pop():
return False
return not stack
I have written the following code to check if some input to the function contains balanced brackets:
def balanced_brackets(text):
brackets = [ ('(',')'), ('[',']'), ('{','}'),('<','>')]
s = 0
e = 1
st = Stack()
for i in text:
for pair in brackets:
if i == pair[s]:
st.push(i)
elif i == pair[e] and not st.isEmpty() and st.pop() != pair[s]:
return False
if st.isEmpty():
return True
else:
return False
This code is working for input such as ‘()(())()’ but it failed when I tried it for ‘zn()((b)())q())()l()d(r)’. Can anyone help me identify what the problem is? Thanks.
Your problem is with the and not st.isEmpty()==0
. When it gets to the unbalanced ')'
, all the previous ones have balanced out, so st is empty.
- If you have a i == pair[e], and your stack is empty, you want to return False.
- You also want to return False if you pop and it isn’t pair[e]. But you don’t want to pop if the stack is empty.
What you have now, in condition 1, just keeps going. You need to change around the condition there so that it accounts for both, or have two elifs. The former can be achieved with some nesting ands and ors.
By the way; unless you want to do something fancy with it, there’s no real need to implement a stack. You can just use a list instead, with l.pop, len(l), and l.append.
This works.It needs a stack module to import. It will keep track of matched pairs.
def multi_bracket_validation(input):
""" test for matching brackets and return bool """
if type(input) is str:
open_b = '({]'
closed_b = ')}]'
compare = Stack()
for brac in input:
if brac in open_b:
compare.push(brac)
elif brac in closed_b:
if compare.top is None:
return False
if closed_b.index(brac) != open_b.index(compare.pop().val):
return False
return compare.top is None
return False
This is one way of doing it:
def check_braces(string:str):
print(string)
braces = [("[","]"), ("{","}"), ("(",")")]
stack = []
for char in string:
for pair in braces:
if char in pair:
if char == pair[0]:
stack.append(pair[1])
elif not stack:
return False
elif char != stack.pop():
return False
return not stack