Знакомимся со стеком — структурой «последним пришёл, первым ушёл».
⏱️ ~1 ч 30 мин·Средний·📚 6 уроков
Бытовая аналогия: стопка тарелок
Стек — это как стопка тарелок на кухне. Новую тарелку вы кладёте сверху, и берёте тоже сверху. Достать нижнюю, не сняв верхние, нельзя. Этот принцип называют LIFO — «последним пришёл, первым ушёл».
В задаче про скобки стек работает так: каждую открывающую скобку «кладём на стопку». Встретив закрывающую, проверяем верхнюю тарелку — подходит ли она по паре. Если да, снимаем её; если нет — скобки расставлены неправильно.
Условие
Дана строкаТекстовое значение в кавычках: "привет". Неизменяема. По-английски string (str). из скобок (), [], {}. Вернуть True, если скобки расставлены правильно: каждая открытая закрыта парной и в верном порядке.
Стек — списокИзменяемая упорядоченная коллекция элементов: [1, 2, 3]. По-английски list., куда кладут и забирают с одного конца (как стопка тарелок). Идём по строке: открывающую скобку кладём в стек; закрывающую — сверяем с тем, что лежит сверху. Если пара совпала — снимаем со стека, иначе строка невалидна.
pairs = {")": "(", ...} — словарьКоллекция пар «ключ → значение»: {"a": 1}. Быстрый доступ по ключу. По-английски dict. «закрывающая → её пара-открывающая». Чтобы быстро узнать, какая открывающая должна лежать сверху.
if ch in "([{" — если символ открывающий, кладём его в стек через append.
if not stack or stack[-1] != pairs[ch] — для закрывающей: если стек пуст (закрывать нечего) или верхняя тарелка не та пара — строка невалидна.
stack.pop() — пара совпала, снимаем верхний элемент.
return len(stack) == 0 — в конце стек должен быть пуст: все открытые скобки закрылись.
💡Совет
Список Python — готовый стек: append() кладёт наверх, pop() снимает сверху, stack[-1] подсматривает верхний элемент. Стек — фундамент для множестваКоллекция уникальных элементов без порядка: {1, 2, 3}. По-английски set. задач: скобки, история действий, обход деревьев.
💡Совет
🔮 Предскажите вывод
Что вернёт is_valid("(()")? Мысленно «складывайте тарелки»: сколько открывающих останется в стеке в конце?
▶ predict-parentheses.py
Ответ — False. Проследим: ( кладём, ( кладём — в стеке две скобки; ) снимает одну. Строка кончилась, а в стеке осталась одна незакрытая (. len(stack) равен 1, не 0 — значит, не все скобки закрыты, ответ False.
⚠️ Частые ошибки новичков
Частая ошибка — забыть проверку на пустой стек not stack. Тогда на строке вроде ")" код попытается обратиться к stack[-1] у пустого списка и упадёт с IndexError. Запустите сломанный код, прочитайте ошибку и добавьте проверку not stack.
▶ broken-parentheses.py
Заданиесредняярешение.py
Реализуйте is_valid(s) для скобок ()[]{} через стек. Верните True, если строка корректна.
Заданиесредняярешение.py
Дополнительное упражнение на стек. Напишите remove_adjacent_duplicates(s), которая убирает пары соседних одинаковых букв, повторяя процесс. Пример: "abbaca" → "ca" (убрали "bb", получили "aaca", убрали "aa", получили "ca"). Используйте стек.
❓Проверь себя
По какому принципу работает стек?
Зачем в задаче о скобках в конце проверять len(stack) == 0?
ℹ️Важно
✅ Что вы узнали
Стек работает по принципу LIFO; список Python — готовый стек (append, pop, [-1]).
Задачи на «парность/вложенность» естественно решаются стеком.
Перед обращением к stack[-1] всегда проверяйте, что стек не пуст.
Комментарии
Загрузка…
Загрузка комментариев…