Пытаюсь уравновесить паратезы, но не понимаю, что не так с моим кодом - PullRequest
0 голосов
/ 25 марта 2020

Хорошо, поэтому я пытаюсь сбалансировать скобки на python, используя стеки. Я пытался понять, что не так, но я не понимаю. Я все еще новичок в python, поэтому со мной все в порядке. Вот код, который я написал:

class Stack:

def __init__(self):
    self.opens = []
    self.closes = []

def empty_opens(self):
    return self.opens == []

def empty_closes(self):
    return self.closes == []

def add_opens(self, item):
    return self.opens.append(item)

def add_closes(self, item):
    return self.closes.append(item)

def is_empty_opens(self):
    return len(self.opens) == 0

def remove_opens(self):
    if not self.is_empty_opens():
        return self.opens.pop(0)

def is_empty_closes(self):
    return len(self.closes) == 0

def remove_closes(self):
    if not self.is_empty_closes():
        return self.closes.pop()


def checker(string):
open = "([{"
close = ")]}"
p = Stack()
for i in string:
    if i == "(" or i == "[" or i == "{":
        p.add_opens(i)
    elif i == ")" or i == "]" or i == "}":
        p.add_closes(i)
if len(p.opens) != len(p.closes):
    return False
else:
    for a in p.opens:
        for b in reversed(p.closes):
            if open.index(a) == close.index(b):
                p.remove_opens()
                p.remove_closes()
if len(p.opens) == 0 and len(p.closes) == 0:
    return True
else:
    return False

Код работает в целом, но кажется, что он не удаляет последние значения "for" l oop. Я добавил печать после цикла «for», чтобы попытаться выяснить это, и вот что я получил:

    ...
    else:
    for a in p.opens:
        for b in reversed(p.closes):
            if open.index(a) == close.index(b):
                p.remove_opens()
                p.remove_closes()
    print(p.opens)
    print(p.closes)
if len(p.opens) == 1 and len(p.closes) == 1:
   ...

Python Console:

checker("{[()]}")
['(']
[')']
False

checker("{[(]]}")
['[', '(']
[']', ']']
False

Я также пытался изменить код, вместо того чтобы использовать .index (), который я пытался используйте диапазон (len ()), но он снова не сработал:

    ...
    else:
    for a in range(len(p.opens)):
        for b in reversed(range(len(p.closes))):
            if a == b:
                p.remove_opens()
                p.remove_closes()
    print(p.opens)
    print(p.closes)
if len(p.opens) == 0 and len(p.closes) == 0:
   ...

  Python Console:

  checker("{[()]}")
  ['(']
  [')']
  False

  checker("{[(]]}")
  ['(']
  [']']
  False

Это, вероятно, ошибка в основном c, но я медленно схожу с ума по этому поводу, поэтому я спрашиваю, может ли кто-нибудь help.

Примечание к коду:

В моем коде я пытаюсь создать класс, создающий 2 списка, один для открытых скобок: "(, [, {" и еще один для закрывающей скобки: "),],}" .

Класс имеет простые методы стека добавления или удаление из списка.

Что касается самого кода, то сначала я пытаюсь отделить символы в скобках от символов, которых нет. Если код находит открытую круглую скобку, он добавляет в список «открытия» и, если он закрывается, он добавляет в список «закрытия» .

После этого он проверяет, сколько предметов есть в каждом списке, и если они не совпадают, то это сразу означает, что они не сбалансированы.

Теперь сложная часть. Если есть одинаковое количество открытых и закрытых скобок, я хочу, чтобы код проверял каждый из них. Из того, что я понимаю, для того, чтобы скобки были сбалансированы, первая открытая скобка в списке «открывает» должна быть равна последней закрытой скобке в списке «закрывает» .

Пример:

Ввод: {[()]}

opens_list = ['{', '[', '('] * 1044) *

'{' = 1 , '[' = 2 , '(' = 3

closes_list = [') ','] ','} ']

') '= 1 , ' ['= 2 , ' {'= 3

Так что они должны совпадать, Открывается (1) = Закрывается (3), Открывается (2) = Закрывается (2) и Открывается (3) = Закрывается (3 )

Исходя из этого, я перевернул закрывающий список, чтобы каждый индекс соответствовал. В начале кода я написал:

def checker(string):
 open = "([{"
 close = ")]}"
 ...

Итак, я пытаюсь взять первый символ в списке opens_list, "{" , проверить, какой индекс у него есть в «открытой переменной» он имеет третий индекс и делает то же самое для списка закрывает .

Если они имеют одинаковый индекс, он удаляет их. В конце концов, если оба списка не имеют каких-либо элементов, он сбалансирован.

Это немного грязно, engli sh не мой родной язык, и я не знаю всех правильных понятий вещей в python но надеюсь это понятно. Я, честно говоря, просто хочу знать, что не так, поэтому я не буду повторять эту ошибку в будущем. Если кто-то может понять это и помочь, я был бы очень признателен.

1 Ответ

0 голосов
/ 25 марта 2020

Проверка соответствия разделителей с использованием стека требует только 3 основных операций c:

  1. Если символ является открывающим разделителем, добавьте его в стек
  2. Если символ является закрывающим разделителем, извлекает стек и проверяет, соответствует ли он закрывающему символу.
  3. Проверка, является ли стек пустым, когда ввод исчерпан.

Нет реальной необходимости выделенный Stack класс; все три операции легко реализуются с помощью простого списка.

def checker(string):
    match = dict(["()", "{}", "[]"])  # Mapping of opening delimiter to its closing partner
    st = []  # Initially empty stack
    for c in string:
        if c in match:  # Push an opening delimiter
            st.append(c)
        elif c in match.values():
            # Try to pop the most recent opening delimiter;
            # return False if that fails or it doesn't match the closing delimiter
            if not st or match[st.pop()] != c:
                return False

    # Check if there were any unclosed delimiters
    return (not st)
...