检查括号是否在python中平衡的函数

时间:2015-05-06 03:08:32

标签: python

我编写了以下代码来检查函数的某些输入是否包含平衡括号:

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

此代码适用于输入,例如'()(())()'但是当我为'zn()((b)())q())()l()d尝试输入时它失败了(R)”。任何人都可以帮我确定问题所在吗?感谢。

2 个答案:

答案 0 :(得分:3)

问题在于and not st.isEmpty()==0。当它到达不平衡')'时,所有先前的都已平衡,因此st 为空。

  1. 如果你有一个i ==对[e],并且你的堆栈是空的,你想要返回False。
  2. 如果你弹出并且它不是对[e]你也想要返回False。但是如果堆栈为空,则不想弹出。
  3. 你现在拥有的,在条件1中,只是继续前进。你需要改变那里的条件,以便它兼顾两者,或者有两个elifs。前者可以通过一些嵌套和ors来实现。

    顺便说一下;除非你想用它做一些奇特的事情,否则没有必要实现堆栈。您可以使用l.pop,len(l)和l.append。

    来使用列表

答案 1 :(得分:0)

这很有效。它需要一个堆栈模块来导入。它将跟踪匹配的对。

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