mirror of
https://github.com/krahets/hello-algo.git
synced 2026-06-30 01:24:21 +00:00
31 lines
4.9 KiB
Markdown
31 lines
4.9 KiB
Markdown
# Резюме
|
||
|
||
### Ключевые моменты
|
||
|
||
- Стек -- это структура данных, следующая принципу «первый вошел -- последний вышел», которая может быть реализована с помощью массива или связного списка.
|
||
- С точки зрения временной эффективности, реализация стека на основе массива имеет более высокую среднюю эффективность, но во время расширения временная сложность одной операции вставки ухудшается до $O(n)$. В сравнении с этим, реализация стека на основе связного списка обеспечивает более стабильную эффективность.
|
||
- С точки зрения пространственной эффективности, реализация стека на основе массива может привести к определенной степени потери пространства. Но следует отметить, что память, занимаемая узлами связного списка, больше, чем элементами массива.
|
||
- Очередь -- это структура данных, следующая принципу «первый пришел -- первый вышел», которая также может быть реализована с помощью массива или связного списка. В сравнении временной и пространственной эффективности выводы для очереди аналогичны выводам для стека.
|
||
- Двусторонняя очередь -- это очередь с большей степенью свободы, которая позволяет добавлять и удалять элементы с обоих концов.
|
||
|
||
### Вопросы и ответы
|
||
|
||
**В**: Реализованы ли функции перехода вперед и назад в браузере с помощью двусвязного списка?
|
||
|
||
Функции перехода вперед и назад в браузере по сути являются проявлением «стека». Когда пользователь посещает новую страницу, эта страница добавляется на вершину стека; когда пользователь нажимает кнопку «назад», эта страница извлекается с вершины стека. Использование двусторонней очереди позволяет удобно реализовать некоторые дополнительные операции, что упоминается в разделе «Двусторонняя очередь».
|
||
|
||
**В**: Нужно ли освобождать память узла после извлечения из стека?
|
||
|
||
Если извлеченный узел потребуется в дальнейшем, то освобождать память не нужно. Если он больше не понадобится, то в таких языках, как `Java` и `Python`, есть автоматическая сборка мусора, поэтому освобождать память вручную не требуется; в `C` и `C++` необходимо освобождать память вручную.
|
||
|
||
**В**: Двусторонняя очередь похожа на два стека, соединенных вместе. Каково ее назначение?
|
||
|
||
Двусторонняя очередь похожа на комбинацию стека и очереди или на два стека, соединенных вместе. Она представляет логику стека + очереди, поэтому может реализовать все применения стека и очереди, и при этом более гибка.
|
||
|
||
**В**: Как именно реализованы отмена (undo) и повтор (redo)?
|
||
|
||
Используются два стека: стек `A` для отмены и стек `B` для повтора.
|
||
|
||
1. Каждый раз, когда пользователь выполняет операцию, эта операция помещается в стек `A`, а стек `B` очищается.
|
||
2. Когда пользователь выполняет «отмену», последняя операция извлекается из стека `A` и помещается в стек `B`.
|
||
3. Когда пользователь выполняет «повтор», последняя операция извлекается из стека `B` и помещается в стек `A`. |