Научитесь сортировать стек без дополнительных структур данных, используя только рекурсию. Пошаговое объяснение с кодом на Python и разбором сложности.
Как отсортировать стек, имея в распоряжении только операции push, pop и peek? Задача популярна на собеседованиях и проверяет понимание рекурсии. В этой статье мы разберём эффективный подход без использования массивов или других структур — только рекурсия и стек. Вы увидите, как элегантно решить задачу и не потерять баллы на интервью.
Дан стек целых чисел. Нужно отсортировать его так, чтобы наименьший элемент оказался на дне, а наибольший — на вершине. Разрешены только стандартные операции стека: push, pop, peek (top) и проверка на пустоту. Нельзя использовать дополнительные структуры данных, такие как массивы или списки.
Первое, что приходит в голову — вытолкнуть все элементы в массив, отсортировать его и загрузить обратно в стек. Этот подход работает за O(N log N) по времени и O(N) по памяти, но нарушает условие задачи: мы используем дополнительный массив. На собеседовании такое решение покажет, что вы не поняли суть ограничений.
Вместо внешнего массива можно использовать стек вызовов рекурсии. Идея проста: удаляем верхний элемент, рекурсивно сортируем оставшийся стек, а затем вставляем удалённый элемент на правильную позицию. Этот метод не требует дополнительных структур — вся информация хранится в кадре стека вызовов.
Рекурсивная функция sort_stack:
Вспомогательная функция insert:
Это гарантирует, что после вставки стек остаётся отсортированным (наибольший наверху).
def sort_stack(st):
# Базовый случай: пустой стек
if not st:
return
# Извлекаем верхний элемент
top = st.pop()
# Рекурсивно сортируем оставшийся стек
sort_stack(st)
# Вставляем top на правильную позицию
insert(st, top)
def insert(st, value):
# Если стек пуст или вершина меньше или равна value — кладём value сверху
if not st or st[-1] <= value:
st.append(value)
return
# Иначе извлекаем верхний элемент
top = st.pop()
# Рекурсивно вставляем value
insert(st, value)
# Возвращаем извлечённый элемент обратно
st.append(top)Рассмотрим стек (вершина справа): [3, 1, 4, 2]. Вызовем sort_stack:
Итоговый стек: [1,2,3,4] (вершина 4 — наибольший).
Рекурсия автоматически сохраняет извлечённые элементы в стеке вызовов. После сортировки меньшего стека мы вставляем каждый удалённый элемент на правильное место. Таким образом, не требуется дополнительной памяти, кроме стека вызовов глубиной O(N).
Теперь вы знаете, как сортировать стек без дополнительных структур. Потренируйтесь на похожих задачах: обращение стека, удаление среднего элемента, проверка сбалансированности скобок. На собеседовании используйте фразу: «Рекурсивно сортируем меньший стек, затем вставляем удалённый элемент на правильную позицию с помощью вспомогательной рекурсивной функции».
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →