+ 2
Сбалансированные скобки
Задача такая: В качестве входных данных дается выражение, нам нужно определить являются ли скобки сбалансированными. Например, "(x+y)*(z-2*(6))" является сбалансированным, а "7-(3(2*9))4) (1" – не сбалансированным. (У каждой открывающейся скобки есть своя закрывающаяся) Решать рекомендуется через стеки. Я написал код, вроде как все работает, но некоторые проверки не проходит. Что я упустил? Пожалуйста, не пишите прямой ответ, реализовать я хочу сам🙏🏻 https://code.sololearn.com/c48nw88hzo33/?ref=app
14 Antworten
+ 6
Допустим будет введено такое выражение: (a(b-c) + d))
Ваш код попытается удалить значение из пустого стека и выдаст ошибку.
Так же как и в приведённом примере:
7-(3(2*9))4) (1
+ 6
вот правильный я замучился
class Stack:
def __init__(self):
self.stack = []
def isEmpty(self):
return self.stack == []
def pushstack(self, item):
self.stack.append(item)
def popstack(self):
if self.stack == []:
return None
else:
return self.stack.pop()
def balanced(s):
stack = Stack()
bopen, bclose = "(", ")"
for c in s:
if c == bopen:
stack.pushstack(c)
elif c == bclose:
if stack.isEmpty():
return False
else:
stackTop = stack.popstack()
return stack.isEmpty()
print(balanced(input()))
+ 4
По мимо этого проверь условие чтобы выражение не начиналось с ) и не закончивалось на (.
В этом примере наверное без стека будет надежнее методом append (я так и сделал)
+ 2
Да, нужно проверить, не начинается ли строка с закрывающейся скобки. А так же в случае появления закрывающейся скобки в качестве начала пары))
У меня так вышло:
for letter in expression:
if letter == "(":
list_stack.insert(0,letter)
elif letter == ")":
if len(list_stack) == 0:
return ("False")
else:
list_stack.pop(0)
if len(list_stack) == 0:
return("True")
else:
return("False")
+ 1
def balanced(expression):
a=0
for i in expression:
if i == '(':
a+=1
elif i == ')':
a-=1
if a == 0:
return True
else:
return False
print(balanced(input()))
Тоже завис понимаю, что если нет скобок, то выдает 0 и это неправильно
+ 1
Зашёл через индекс и все получилось, хотя может быть сильно усложнил код
+ 1
Легко через try/except. Ниже полный код.
def balanced(expression):
try:
list=[]
for item in expression :
if item =='(':
list.insert(0, item)
elif item == ')':
list.pop(0)
if len(list)==0:
print ('True')
else:
print ('False')
except (IndexError):
print('False')
balanced(input())
0
Алексей Дерябин , в задании ничего не сказано про условие с отсутствием скобок в выражении, но если вас это беспокоит, то добавьте это условие, но я бы вам всё-же рекомендовал решить это задание с помощью стека.
0
Все равно 7 тест выдает ошибку, не понимаю...
0
Алексей Дерябин , как вы думаете, что выдаст ваш код при таком вводе: ')(' 😉
0
Понял, спасибо
0
Да, в случае если изначально в тексте стоит ")" он выдает ошибку, к примеру )( он посчитает неправильно
0
https://code.sololearn.com/c0tVIfh33hoh/?ref=app
Много чего лишнего, но пока сделал так и всё работает
0
Hi. Why it doesn’t work? Help me please
def balanced(expression):
class Stack:
def__init__(self):
self.stack = []
def isEmpty(self):
return self.stack == []
def pushstack.append(item):
self.stack.append(item)
def popstack(self):
if self.stack == []:
return None
else:
return self.stack.pop()
def balanced(s):
stack = Stack()
bopen, bclose = "(",")"
for c in s:
if c == bopen:
stack.pushstach(c)
elif c == bclose:
if stack.isEmpty():
return False
else:
stackTop = stack.popstack()
return stack.isEmpty()
print(balanced(input()))