This commit is contained in:
krahets
2023-03-12 02:44:47 +08:00
parent 93bb3267bb
commit ec21803385
5 changed files with 82 additions and 65 deletions

View File

@@ -865,6 +865,13 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#533" class="md-nav__link">
5.3.3. &nbsp; 双向队列应用
</a>
</li>
</ul>
@@ -1706,6 +1713,13 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#533" class="md-nav__link">
5.3.3. &nbsp; 双向队列应用
</a>
</li>
</ul>
@@ -1848,28 +1862,28 @@
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">deque.py</span><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="sd">&quot;&quot;&quot; 初始化双向队列 &quot;&quot;&quot;</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="n">duque</span> <span class="o">=</span> <span class="n">deque</span><span class="p">()</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="n">deque</span> <span class="o">=</span> <span class="n">deque</span><span class="p">()</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="sd">&quot;&quot;&quot; 元素入队 &quot;&quot;&quot;</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="n">duque</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1"># 添加至队尾</span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="n">duque</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="n">duque</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="n">duque</span><span class="o">.</span><span class="n">appendleft</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="c1"># 添加至队首</span>
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="n">duque</span><span class="o">.</span><span class="n">appendleft</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="n">deque</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1"># 添加至队尾</span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="n">deque</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="n">deque</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="n">deque</span><span class="o">.</span><span class="n">appendleft</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="c1"># 添加至队首</span>
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="n">deque</span><span class="o">.</span><span class="n">appendleft</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a>
<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="sd">&quot;&quot;&quot; 访问元素 &quot;&quot;&quot;</span>
<a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a><span class="n">front</span> <span class="o">=</span> <span class="n">duque</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># 队首元素</span>
<a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a><span class="n">rear</span> <span class="o">=</span> <span class="n">duque</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># 队尾元素</span>
<a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a><span class="n">front</span> <span class="o">=</span> <span class="n">deque</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># 队首元素</span>
<a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a><span class="n">rear</span> <span class="o">=</span> <span class="n">deque</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># 队尾元素</span>
<a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a>
<a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a><span class="sd">&quot;&quot;&quot; 元素出队 &quot;&quot;&quot;</span>
<a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a><span class="n">pop_front</span> <span class="o">=</span> <span class="n">duque</span><span class="o">.</span><span class="n">popleft</span><span class="p">()</span> <span class="c1"># 队首元素出队</span>
<a id="__codelineno-2-17" name="__codelineno-2-17" href="#__codelineno-2-17"></a><span class="n">pop_rear</span> <span class="o">=</span> <span class="n">duque</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span> <span class="c1"># 队尾元素出队</span>
<a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a><span class="n">pop_front</span> <span class="o">=</span> <span class="n">deque</span><span class="o">.</span><span class="n">popleft</span><span class="p">()</span> <span class="c1"># 队首元素出队</span>
<a id="__codelineno-2-17" name="__codelineno-2-17" href="#__codelineno-2-17"></a><span class="n">pop_rear</span> <span class="o">=</span> <span class="n">deque</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span> <span class="c1"># 队尾元素出队</span>
<a id="__codelineno-2-18" name="__codelineno-2-18" href="#__codelineno-2-18"></a>
<a id="__codelineno-2-19" name="__codelineno-2-19" href="#__codelineno-2-19"></a><span class="sd">&quot;&quot;&quot; 获取双向队列的长度 &quot;&quot;&quot;</span>
<a id="__codelineno-2-20" name="__codelineno-2-20" href="#__codelineno-2-20"></a><span class="n">size</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">duque</span><span class="p">)</span>
<a id="__codelineno-2-20" name="__codelineno-2-20" href="#__codelineno-2-20"></a><span class="n">size</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">deque</span><span class="p">)</span>
<a id="__codelineno-2-21" name="__codelineno-2-21" href="#__codelineno-2-21"></a>
<a id="__codelineno-2-22" name="__codelineno-2-22" href="#__codelineno-2-22"></a><span class="sd">&quot;&quot;&quot; 判断双向队列是否为空 &quot;&quot;&quot;</span>
<a id="__codelineno-2-23" name="__codelineno-2-23" href="#__codelineno-2-23"></a><span class="n">is_empty</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">duque</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>
<a id="__codelineno-2-23" name="__codelineno-2-23" href="#__codelineno-2-23"></a><span class="n">is_empty</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">deque</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>
</code></pre></div>
</div>
<div class="tabbed-block">
@@ -3746,6 +3760,9 @@
</div>
</div>
</div>
<h2 id="533">5.3.3. &nbsp; 双向队列应用<a class="headerlink" href="#533" title="Permanent link">&para;</a></h2>
<p>双向队列同时表现出栈与队列的逻辑,<strong>因此可以实现两者的所有应用,并且提供更高的自由度</strong></p>
<p>我们知道,软件的“撤销”功能需要使用栈来实现;系统把每一次更改操作 <code>push</code> 到栈中,然后通过 <code>pop</code> 实现撤销。然而,考虑到系统资源有限,软件一般会限制撤销的步数(例如仅允许保存 <span class="arithmatex">\(50\)</span> 步),那么当栈的长度 <span class="arithmatex">\(&gt; 50\)</span> 时,软件就需要在栈底(即队首)执行删除,<strong>但栈无法实现,此时就需要使用双向队列来替代栈</strong>。注意,“撤销”的核心逻辑仍然是栈的先入后出,只是双向队列可以更加灵活地实现。</p>