Хорошо, поэтому я пытаюсь сбалансировать скобки на 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 но надеюсь это понятно. Я, честно говоря, просто хочу знать, что не так, поэтому я не буду повторять эту ошибку в будущем. Если кто-то может понять это и помочь, я был бы очень признателен.