mirror of
https://github.com/krahets/hello-algo.git
synced 2026-06-30 17:44:26 +00:00
build
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -0,0 +1,21 @@
|
||||
---
|
||||
comments: true
|
||||
icon: material/stack-overflow
|
||||
---
|
||||
|
||||
# Глава 5. Стек и очередь
|
||||
|
||||
{ class="cover-image" }
|
||||
|
||||
!!! abstract
|
||||
|
||||
Стек похож на стопку кошек, а очередь - на очередь из кошек.
|
||||
|
||||
Эти две структуры соответственно представляют отношения "последним пришел - первым вышел" и "первым пришел - первым вышел".
|
||||
|
||||
## Содержание главы
|
||||
|
||||
- [5.1 Стек](stack.md)
|
||||
- [5.2 Очередь](queue.md)
|
||||
- [5.3 Двусторонняя очередь](deque.md)
|
||||
- [5.4 Резюме](summary.md)
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,35 @@
|
||||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 5.4 Краткие итоги
|
||||
|
||||
### 1. Основные моменты
|
||||
|
||||
- Стек - это структура данных, следующая правилу "последним пришел - первым вышел", и его можно реализовать с помощью массива или связного списка.
|
||||
- С точки зрения временной эффективности реализация стека на массиве обычно работает быстрее в среднем, но во время расширения емкости временная сложность отдельной операции push может ухудшаться до $O(n)$ . Напротив, реализация стека на связном списке дает более стабильные характеристики.
|
||||
- С точки зрения использования памяти реализация стека на массиве может приводить к некоторой потере пространства. Однако следует учитывать, что узлы связного списка занимают больше памяти, чем элементы массива.
|
||||
- Очередь - это структура данных, следующая правилу "первым пришел - первым вышел", и ее также можно реализовать с помощью массива или связного списка. Сравнение временной и пространственной эффективности для очереди в целом приводит к тем же выводам, что и для стека.
|
||||
- Двусторонняя очередь - это очередь с более высокой степенью свободы, которая позволяет добавлять и удалять элементы с обеих сторон.
|
||||
|
||||
### 2. Q & A
|
||||
|
||||
**Q**: Реализованы ли кнопки "вперед" и "назад" в браузере с помощью двусвязного списка?
|
||||
|
||||
По сути, функция переходов "вперед/назад" в браузере отражает логику "стека". Когда пользователь открывает новую страницу, она помещается на вершину стека; когда пользователь нажимает кнопку "назад", эта страница снимается с вершины стека. Двусторонняя очередь позволяет удобно реализовать некоторые дополнительные операции, об этом уже упоминалось в разделе "Двусторонняя очередь".
|
||||
|
||||
**Q**: Нужно ли освобождать память узла после извлечения его из стека?
|
||||
|
||||
Если извлеченный узел еще понадобится, память освобождать не нужно. Если он больше не нужен, то в языках `Java` и `Python` есть автоматический сборщик мусора, поэтому ручное освобождение памяти не требуется; в `C` и `C++` память нужно освобождать вручную.
|
||||
|
||||
**Q**: Двусторонняя очередь выглядит как два соединенных стека. Для чего она нужна?
|
||||
|
||||
Двусторонняя очередь похожа на комбинацию стека и очереди или на два соединенных стека. Она выражает логику "стек + очередь", поэтому может покрыть все применения стека и очереди и при этом остается более гибкой.
|
||||
|
||||
**Q**: Как именно реализуются отмена (undo) и повтор (redo)?
|
||||
|
||||
Используются два стека: стек `A` для отмены и стек `B` для повтора.
|
||||
|
||||
1. Каждый раз, когда пользователь выполняет действие, это действие помещается в стек `A` , а стек `B` очищается.
|
||||
2. Когда пользователь выполняет "undo", последнее действие извлекается из стека `A` и помещается в стек `B` .
|
||||
3. Когда пользователь выполняет "redo", последнее действие извлекается из стека `B` и помещается обратно в стек `A` .
|
||||
Reference in New Issue
Block a user