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.

Asked By: ASm

||

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.

  1. If you have a i == pair[e], and your stack is empty, you want to return False.
  2. 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.

Answered By: cge

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
Answered By: Jay

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
Answered By: Tarun Singh
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.