Python 平衡括号检查器

Python balance brackets checker

我正在尝试根据我创建的 class 创建一个检查平衡括号的函数。 但我一直都是假的。 如果你能告诉我我错在哪里并解释我错误的解决方案,我将不胜感激。

    class Stack:
    def __init__(self):
        self.__items = []
        self.__top = 0

    def is_Empty(self):
        if self.__top <= 0:
            return "Stack Empty!"
        else:
            return f"Your stack is not Empty!\nThe current stack is {self.my_stack()}"

    def __str__(self):
        """Print current stack"""
        return self.my_stack()

    def push(self, item):
        """Push item in stack."""
        self.__items.append(item)
        self.__top += 1

    def pop(self):
        """Remove top of the stack."""
        if self.__top <= 0:
            return self.is_Empty()
        self.__top -= 1
        return self.__items.pop()

    def top(self):
        """Return top of the stack."""
        if self.__top <= 0:
            return self.is_Empty()
        else:
            return self.__items[-1]

    def my_stack(self):
        """Show the current stack"""
        if not self.__items:
            return self.is_Empty()
        else:
            return f"The current stack is {self.__items}"


def check_balance(test):
    """
    Return True if brackets are balanced, False otherwise.
    """
    oppositeBracket = {']': '[', ')': '(', '}': '{'}
    lefts = Stack()
    for char in test:
        if char in '[({':
            lefts.push(char)
        if char in '])}':
            if lefts.is_Empty():
                return False
            else:
                if lefts.top() != oppositeBracket[char]:
                    return False
            lefts.pop()
    if not lefts:
        return True
    return False

例如:

print(check_balance("(10+10)"))

然后我得到

False

您将 is_Empty 视为返回布尔值,但它没有。它 returns 在任何一种情况下都是一个字符串。 (在布尔意义上总是 "True")

单元测试:

l = Stack()
l.push('1')
assert not l.is_Empty()

这个断言不应该失败,但确实失败了。

您的代码中有 2 个小错误:

  • isEmpty 方法 return 总是 True 因为你 return 非空字符串。
  • 您对空堆栈 (if not lefts) 的最终检查也始终是 True,因为 lefts 等于您的堆栈对象,即使它是空的,它也不会合乎逻辑 False.

代码应该是:

class Stack:
    def __init__(self):
        self.__items = []
        self.__top = 0

    def is_Empty(self):
        return self.__top <= 0


    def __str__(self):
        """Print current stack"""
        return self.my_stack()

    def push(self, item):
        """Push item in stack."""
        self.__items.append(item)
        self.__top += 1

    def pop(self):
        """Remove top of the stack."""
        if self.__top <= 0:
            return self.is_Empty()
        self.__top -= 1
        return self.__items.pop()

    def top(self):
        """Return top of the stack."""
        if self.__top <= 0:
            return self.is_Empty()
        else:
            return self.__items[-1]

    def my_stack(self):
        """Show the current stack"""
        if not self.__items:
            return self.is_Empty()
        else:
            return f"The current stack is {self.__items}"

def check_balance(test):
    """
    Return True if brackets are balanced, False otherwise.
    """
    oppositeBracket = {']': '[', ')': '(', '}': '{'}
    lefts = Stack()
    for char in test:
        if char in '[({':
            lefts.push(char)
        elif char in '])}':
            if lefts.is_Empty():
                return False
            else:
                if lefts.top() != oppositeBracket[char]:
                    return False
            lefts.pop()
    return lefts.is_Empty()