python solution.py

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

Проверьте вложенность трёх видов скобок, игнорируя остальные символы строки.

  • ЯзыкPython
  • УровеньНачальный
  • НавыкСтек и проверка корректной вложенности

Контекст

Линтер конфигов первым делом смотрит, не забыл ли автор закрыть скобку. Открыли ( — где-то ниже должна быть парная ), причём вложенность обязана соблюдаться: [ нельзя закрыть через ). Считать скобки счётчиком недостаточно — в строке ([)] открывающих и закрывающих поровну, а конфиг всё равно битый. Спасает стек: каждую открывающую кладём на вершину, каждая закрывающая обязана снять именно парную ей.

Задача

Реализуйте функцию is_balanced(source): source — строка с текстом конфига. Верните True, если все скобки ()[]{} корректно вложены и закрыты, иначе False.

Правила

  1. Идите по строке слева направо.
  2. Открывающую скобку ((, [, {) кладите на вершину стека.
  3. Закрывающая (), ], }) должна снять с вершины парную ей открывающую. Если стек пуст или на вершине другая открывающая — верните False.
  4. Любой символ, не являющийся одной из шести скобок, игнорируется.
  5. После обработки всей строки стек должен быть пуст — иначе осталась незакрытая скобка и ответ False.
  6. Пустая строка сбалансирована: верните True.

Примеры

is_balanced("(a[b]{c})")
# True  — каждая закрывающая снимает парную вершину, стек опустел

is_balanced("([)]")
# False — скобок поровну, но «)» приходит при вершине «[»

is_balanced("(()")
# False — одна «(» осталась незакрытой

is_balanced("")
# True  — пустой ввод сбалансирован

Где это пригодится

Сопоставление скобок по стеку — основа любого парсера: компилятор, линтер, подсветка пар скобок в редакторе. Тот же приём проверяет парность тегов в HTML и вложенность блоков в JSON или YAML. Везде, где есть «открыли — закрыли» с вложенностью, под капотом работает стек.

Двигайтесь по одному шагу

Подсказка 1

Сопоставьте каждую закрывающую скобку с ожидаемой открывающей.

Подсказка 2

Перед снятием вершины проверьте, что стек не пуст.

Подсказка 3

После обхода корректный стек должен быть пустым.

Как стек хранит незакрытые скобки

Открывающая скобка попадает в стек, а закрывающая должна совпасть с его вершиной.

Не оставляйте задачу изолированной