Как узнать
вложенные пары (скобки, теги), отмена или «шаг назад» (путь с ".."), вычисление выражения или стек, который должен сразу отвечать «какой минимум?», если хранить рядом с каждым элементом что-то ещё, например текущий минимум.
Как решать такие задачи
- Спроси себя, нужно ли закончить сначала то, что начато последним: открытую скобку, папку, в которую зашли, число, которое ждёт операцию.
- Клади в стек то, что ещё открыто. Когда что-то это закрывает, сними верх и проверь или объедини.
- Не забудь крайние случаи: снятие из пустого стека и то, что осталось в стеке в конце.
- Если в любой момент нужен ещё и минимум (или максимум), клади его вместе с каждым элементом: пару (значение, минимум до сих пор). Тогда верх всегда знает ответ за O(1).
Вариант: Вычисление
То же, но в стопке лежат числа: операция снимает два верхних, считает и кладёт результат обратно. Так вычисляют выражение без скобок и приоритетов.
- Каждое число сразу клади в стек.
- На операции сначала сними b, потом a: верх — правый операнд, это важно для − и ÷.
- Положи a op b обратно; в конце в стеке ровно одно число — ответ.
- Для обычного выражения со скобками держи текущий результат и знак; на «(» положи их в стек и начни заново, на «)» сними и объедини.
Где встречается
- Вызовы функций. Когда функция вызывает другую, программа кладёт в стек, куда вернуться. Вернуться нужно сначала из последнего вызова, поэтому это стек, а ошибка «stack overflow» — его переполнение.
- Разбор HTML. Читая страницу, браузер держит стек открытых тегов. Закрывающий тег закрывает тот, что на верху стека; так парсер описан в стандарте HTML.
- Отмена действий. Ctrl+Z в редакторе отменяет сначала последнее действие, потом предыдущее: действия лежат в стеке.