Files
hello-algo/ru/docs/chapter_stack_and_queue/summary.md
2026-01-20 15:08:42 +08:00

4.9 KiB
Raw Blame History

Резюме

Ключевые моменты

  • Стек -- это структура данных, следующая принципу «первый вошел -- последний вышел», которая может быть реализована с помощью массива или связного списка.
  • С точки зрения временной эффективности, реализация стека на основе массива имеет более высокую среднюю эффективность, но во время расширения временная сложность одной операции вставки ухудшается до O(n). В сравнении с этим, реализация стека на основе связного списка обеспечивает более стабильную эффективность.
  • С точки зрения пространственной эффективности, реализация стека на основе массива может привести к определенной степени потери пространства. Но следует отметить, что память, занимаемая узлами связного списка, больше, чем элементами массива.
  • Очередь -- это структура данных, следующая принципу «первый пришел -- первый вышел», которая также может быть реализована с помощью массива или связного списка. В сравнении временной и пространственной эффективности выводы для очереди аналогичны выводам для стека.
  • Двусторонняя очередь -- это очередь с большей степенью свободы, которая позволяет добавлять и удалять элементы с обоих концов.

Вопросы и ответы

В: Реализованы ли функции перехода вперед и назад в браузере с помощью двусвязного списка?

Функции перехода вперед и назад в браузере по сути являются проявлением «стека». Когда пользователь посещает новую страницу, эта страница добавляется на вершину стека; когда пользователь нажимает кнопку «назад», эта страница извлекается с вершины стека. Использование двусторонней очереди позволяет удобно реализовать некоторые дополнительные операции, что упоминается в разделе «Двусторонняя очередь».

В: Нужно ли освобождать память узла после извлечения из стека?

Если извлеченный узел потребуется в дальнейшем, то освобождать память не нужно. Если он больше не понадобится, то в таких языках, как Java и Python, есть автоматическая сборка мусора, поэтому освобождать память вручную не требуется; в C и C++ необходимо освобождать память вручную.

В: Двусторонняя очередь похожа на два стека, соединенных вместе. Каково ее назначение?

Двусторонняя очередь похожа на комбинацию стека и очереди или на два стека, соединенных вместе. Она представляет логику стека + очереди, поэтому может реализовать все применения стека и очереди, и при этом более гибка.

В: Как именно реализованы отмена (undo) и повтор (redo)?

Используются два стека: стек A для отмены и стек B для повтора.

  1. Каждый раз, когда пользователь выполняет операцию, эта операция помещается в стек A, а стек B очищается.
  2. Когда пользователь выполняет «отмену», последняя операция извлекается из стека A и помещается в стек B.
  3. Когда пользователь выполняет «повтор», последняя операция извлекается из стека B и помещается в стек A.