+ 2

Сбалансированные скобки

Задача такая: В качестве входных данных дается выражение, нам нужно определить являются ли скобки сбалансированными. Например, "(x+y)*(z-2*(6))" является сбалансированным, а "7-(3(2*9))4) (1" – не сбалансированным. (У каждой открывающейся скобки есть своя закрывающаяся) Решать рекомендуется через стеки. Я написал код, вроде как все работает, но некоторые проверки не проходит. Что я упустил? Пожалуйста, не пишите прямой ответ, реализовать я хочу сам🙏🏻 https://code.sololearn.com/c48nw88hzo33/?ref=app

4th Dec 2021, 8:30 PM
Серафим
Серафим - avatar
14 Antworten
+ 6
Допустим будет введено такое выражение: (a(b-c) + d)) Ваш код попытается удалить значение из пустого стека и выдаст ошибку. Так же как и в приведённом примере: 7-(3(2*9))4) (1
5th Dec 2021, 2:09 AM
Solo
Solo - avatar
+ 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()))
16th Jul 2022, 3:15 PM
shceo
shceo - avatar
+ 4
По мимо этого проверь условие чтобы выражение не начиналось с ) и не закончивалось на (. В этом примере наверное без стека будет надежнее методом append (я так и сделал)
10th Dec 2021, 3:09 AM
Aleksey Buzulenkov
Aleksey Buzulenkov - avatar
+ 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")
23rd Mar 2022, 5:30 AM
Evgeny Sheklyaev
+ 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 и это неправильно
21st Jun 2022, 4:38 PM
Алексей Дерябин
+ 1
Зашёл через индекс и все получилось, хотя может быть сильно усложнил код
24th Jun 2022, 7:49 AM
Алексей Дерябин
+ 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())
16th Apr 2023, 6:28 PM
Арсений Поддубный
Арсений Поддубный - avatar
0
Алексей Дерябин , в задании ничего не сказано про условие с отсутствием скобок в выражении, но если вас это беспокоит, то добавьте это условие, но я бы вам всё-же рекомендовал решить это задание с помощью стека.
22nd Jun 2022, 11:06 PM
Solo
Solo - avatar
0
Все равно 7 тест выдает ошибку, не понимаю...
23rd Jun 2022, 4:02 PM
Алексей Дерябин
0
Алексей Дерябин , как вы думаете, что выдаст ваш код при таком вводе: ')(' 😉
23rd Jun 2022, 11:01 PM
Solo
Solo - avatar
0
Понял, спасибо
24th Jun 2022, 3:04 AM
Алексей Дерябин
0
Да, в случае если изначально в тексте стоит ")" он выдает ошибку, к примеру )( он посчитает неправильно
30th Jun 2022, 12:14 PM
Алексей Дерябин
0
https://code.sololearn.com/c0tVIfh33hoh/?ref=app Много чего лишнего, но пока сделал так и всё работает
4th Feb 2023, 5:56 PM
Карим Динаев
Карим Динаев - avatar
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()))
12th Jul 2023, 10:47 PM
Aleksandr Lakuta