Скобки со сбалансированным стеком не работают - PullRequest
0 голосов
/ 26 мая 2020

У меня есть стек классов, который выглядит следующим образом.

У меня есть эта функция, которая проверяет, действительна ли данная строка скобок.

После отладки и печати текущего символа и символа на пике: Этот вывод соответствует условию в строке 40 и должен вытолкнуть элемент. Но не делает. Вот полный код.

class Stack:

    def __init__(self):
        self.item = []

    def push(self, item):
        self.item.append(item)

    def pop(self):
        self.item.pop()

    def isEmpty(self):
        return self.item == []

    def peek(self):
        if not self.isEmpty():
            return self.item[-1]
        else:
            return "Stack is Empty."

    def getStack(self):
        return self.item

s = Stack()
string  = "{[{()}][]}"
print(list(string))

def isValid(String):
    for char in string:
        # print(char)
        print("Peak -> " +s.peek())
        print("char -> " + char)

        if char == "(" or char == "[" or char == "{":
            s.push(char)
        elif (char == ")" and s.peek == "("):
            s.pop()
        elif (char == "]" and not s.isEmpty() and s.peek == "["):
            s.pop()
        elif (char == "}" and not s.isEmpty() and s.peek == "{"):
            s.pop()
        else:
            return False

    return s.isEmpty()

print(isValid(string))

Перед проверкой оператора if, char ->) и s.peak возвращает -> (. Итак, он должен быть отображен, но вместо этого не запускается ни один оператор if и возвращает false. (PS, если я использую или вместо и, он работает (по крайней мере, для пары, которую я пробовал). Разве это не сработает для и , а не для или )

Что-то не хватает? Помогите, кто-нибудь!

1 Ответ

0 голосов
/ 26 мая 2020

Вы сравниваете строки с объектом функции s.peek == "[". Вам необходимо позвонить по номеру s.peek().

Измените свои elif условия на это

elif char == ")" and s.peek() == "(":
    s.pop()
elif (char == "]" and not s.isEmpty() and s.peek() == "["):
    s.pop()
elif (char == "}" and not s.isEmpty() and s.peek() == "{"):
    s.pop()
...