This commit is contained in:
krahets
2026-04-14 18:06:19 +08:00
parent 17b2a0b630
commit cf0747ba3e
131 changed files with 604 additions and 609 deletions
@@ -4359,25 +4359,25 @@
<h1 id="54">5.4 &nbsp; Резюме<a class="headerlink" href="#54" title="Permanent link">&para;</a></h1>
<h3 id="1">1. &nbsp; Основные выводы<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<ul>
<li>Стек - это структура данных, следующая правилу "последним пришел - первым вышел", и его можно реализовать с помощью массива или связного списка.</li>
<li>Стек - это структура данных, следующая правилу «последним пришел - первым вышел», и его можно реализовать с помощью массива или связного списка.</li>
<li>С точки зрения временной эффективности реализация стека на массиве обычно работает быстрее в среднем, но во время расширения емкости временная сложность отдельной операции <code>push</code> может ухудшаться до <span class="arithmatex">\(O(n)\)</span> . Напротив, реализация стека на связном списке дает более стабильные характеристики.</li>
<li>С точки зрения использования памяти реализация стека на массиве может приводить к некоторой потере пространства. Однако следует учитывать, что узлы связного списка занимают больше памяти, чем элементы массива.</li>
<li>Очередь - это структура данных, следующая правилу "первым пришел - первым вышел", и ее также можно реализовать с помощью массива или связного списка. Сравнение временной и пространственной эффективности для очереди в целом приводит к тем же выводам, что и для стека.</li>
<li>Очередь - это структура данных, следующая правилу «первым пришел - первым вышел», и ее также можно реализовать с помощью массива или связного списка. Сравнение временной и пространственной эффективности для очереди в целом приводит к тем же выводам, что и для стека.</li>
<li>Двусторонняя очередь - это очередь с более высокой степенью свободы, которая позволяет добавлять и удалять элементы с обоих концов.</li>
</ul>
<h3 id="2-q-a">2. &nbsp; Q &amp; A<a class="headerlink" href="#2-q-a" title="Permanent link">&para;</a></h3>
<p><strong>Q</strong>: Реализованы ли кнопки "вперед" и "назад" в браузере с помощью двусвязного списка?</p>
<p>По сути, функция переходов "вперед/назад" в браузере отражает логику стека. Когда пользователь открывает новую страницу, она помещается на вершину стека; когда пользователь нажимает кнопку "назад", эта страница снимается с вершины стека. Двусторонняя очередь позволяет удобно реализовать некоторые дополнительные операции, об этом уже упоминалось в разделе "Двусторонняя очередь".</p>
<p><strong>Q</strong>: Реализованы ли кнопки «вперед» и «назад» в браузере с помощью двусвязного списка?</p>
<p>По сути, функция переходов «вперед/назад» в браузере отражает логику стека. Когда пользователь открывает новую страницу, она помещается на вершину стека. Когда пользователь нажимает кнопку «назад», эта страница снимается с вершины стека. Двусторонняя очередь позволяет удобно реализовать некоторые дополнительные операции, об этом уже упоминалось в разделе «Двусторонняя очередь».</p>
<p><strong>Q</strong>: Нужно ли освобождать память узла после извлечения его из стека?</p>
<p>Если извлеченный узел еще понадобится, память освобождать не нужно. Если он больше не нужен, то в языках <code>Java</code> и <code>Python</code> есть автоматический сборщик мусора, поэтому ручное освобождение памяти не требуется; в <code>C</code> и <code>C++</code> память нужно освобождать вручную.</p>
<p>Если извлеченный узел еще понадобится, память освобождать не нужно. Если он больше не нужен, то в языках <code>Java</code> и <code>Python</code> есть автоматический сборщик мусора, поэтому ручное освобождение памяти не требуется. В <code>C</code> и <code>C++</code> память нужно освобождать вручную.</p>
<p><strong>Q</strong>: Двусторонняя очередь выглядит как два соединенных стека. Для чего она нужна?</p>
<p>Двусторонняя очередь похожа на комбинацию стека и очереди или на два соединенных стека. Она объединяет логику обеих структур, поэтому может покрыть все их применения и при этом остается более гибкой.</p>
<p><strong>Q</strong>: Как именно реализуются отмена (undo) и повтор (redo)?</p>
<p>Используются два стека: стек <code>A</code> для отмены и стек <code>B</code> для повтора.</p>
<ol>
<li>Каждый раз, когда пользователь выполняет действие, это действие помещается в стек <code>A</code> , а стек <code>B</code> очищается.</li>
<li>Когда пользователь выполняет "undo", последнее действие извлекается из стека <code>A</code> и помещается в стек <code>B</code> .</li>
<li>Когда пользователь выполняет "redo", последнее действие извлекается из стека <code>B</code> и помещается обратно в стек <code>A</code> .</li>
<li>Когда пользователь выполняет «undo», последнее действие извлекается из стека <code>A</code> и помещается в стек <code>B</code> .</li>
<li>Когда пользователь выполняет «redo», последнее действие извлекается из стека <code>B</code> и помещается обратно в стек <code>A</code> .</li>
</ol>
<!-- Source file information -->