【问题标题】:Python balance brackets checkerPython平衡括号检查器
【发布时间】:2020-08-09 07:10:30
【问题描述】:

我正在尝试根据我创建的类创建一个检查余额括号的函数。 但我一直都在弄错。 如果您能告诉我我错在哪里并解释我的错误的解决方案,我将不胜感激。

    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

【问题讨论】:

    标签: python python-3.x stack brackets


    【解决方案1】:

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

    • isEmpty 方法总是返回 True,因为你返回的是非空字符串。
    • 您对空堆栈 (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()
    
    

    【讨论】:

      【解决方案2】:

      您将 is_Empty 视为返回布尔值,但事实并非如此。无论哪种情况,它都会返回一个字符串。 (在布尔意义上,这总是“真”)

      单元测试:

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

      这个断言不应该失败,但是会失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-01
        • 2022-08-13
        • 1970-01-01
        • 1970-01-01
        • 2019-01-12
        • 2019-11-01
        • 2011-02-12
        • 2017-06-10
        相关资源
        最近更新 更多