Python проверка балансировочных скобок - PullRequest
1 голос
/ 25 апреля 2020

Я пытаюсь создать функцию, которая проверяет скобки баланса, в соответствии с классом, который я создал. Но я все время получаю Ложь. Буду очень признателен, если вы покажете мне, где я был не прав, и объясните мне решение моей ошибки.

    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

Ответы [ 2 ]

3 голосов
/ 25 апреля 2020

В вашем коде 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 голосов
/ 25 апреля 2020

Вы рассматриваете is_Empty как возвращение логического значения, но это не так. Он возвращает строку в любом случае. (и это всегда "True" в логическом смысле)

UnitTest:

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

Это утверждение не должно завершиться ошибкой, но оно происходит.

...