This commit is contained in:
krahets
2024-04-09 20:43:47 +08:00
parent cceeb4658b
commit a4dec11e8e
60 changed files with 2976 additions and 1970 deletions

View File

@@ -4092,7 +4092,32 @@
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">deque.rb</span><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a>
<div class="highlight"><span class="filename">deque.rb</span><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="c1"># 初始化双向队列</span>
<a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a><span class="c1"># Ruby 没有内直的双端队列,只能把 Array 当作双端队列来使用</span>
<a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a><span class="n">deque</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[]</span>
<a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-4"></a>
<a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a><span class="c1"># 元素如队</span>
<a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a><span class="n">deque</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="mi">2</span>
<a id="__codelineno-12-7" name="__codelineno-12-7" href="#__codelineno-12-7"></a><span class="n">deque</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="mi">5</span>
<a id="__codelineno-12-8" name="__codelineno-12-8" href="#__codelineno-12-8"></a><span class="n">deque</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="mi">4</span>
<a id="__codelineno-12-9" name="__codelineno-12-9" href="#__codelineno-12-9"></a><span class="c1"># 请注意由于是数组Array#unshift 方法的时间复杂度为 O(n)</span>
<a id="__codelineno-12-10" name="__codelineno-12-10" href="#__codelineno-12-10"></a><span class="n">deque</span><span class="o">.</span><span class="n">unshift</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<a id="__codelineno-12-11" name="__codelineno-12-11" href="#__codelineno-12-11"></a><span class="n">deque</span><span class="o">.</span><span class="n">unshift</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<a id="__codelineno-12-12" name="__codelineno-12-12" href="#__codelineno-12-12"></a>
<a id="__codelineno-12-13" name="__codelineno-12-13" href="#__codelineno-12-13"></a><span class="c1"># 访问元素</span>
<a id="__codelineno-12-14" name="__codelineno-12-14" href="#__codelineno-12-14"></a><span class="n">peek_first</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">deque</span><span class="o">.</span><span class="n">first</span>
<a id="__codelineno-12-15" name="__codelineno-12-15" href="#__codelineno-12-15"></a><span class="n">peek_last</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">deque</span><span class="o">.</span><span class="n">last</span>
<a id="__codelineno-12-16" name="__codelineno-12-16" href="#__codelineno-12-16"></a>
<a id="__codelineno-12-17" name="__codelineno-12-17" href="#__codelineno-12-17"></a><span class="c1"># 元素出队</span>
<a id="__codelineno-12-18" name="__codelineno-12-18" href="#__codelineno-12-18"></a><span class="c1"># 请注意,由于是数组, Array#shift 方法的时间复杂度为 O(n)</span>
<a id="__codelineno-12-19" name="__codelineno-12-19" href="#__codelineno-12-19"></a><span class="n">pop_front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">deque</span><span class="o">.</span><span class="n">shift</span>
<a id="__codelineno-12-20" name="__codelineno-12-20" href="#__codelineno-12-20"></a><span class="n">pop_back</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">deque</span><span class="o">.</span><span class="n">pop</span>
<a id="__codelineno-12-21" name="__codelineno-12-21" href="#__codelineno-12-21"></a>
<a id="__codelineno-12-22" name="__codelineno-12-22" href="#__codelineno-12-22"></a><span class="c1"># 获取双向队列的长度</span>
<a id="__codelineno-12-23" name="__codelineno-12-23" href="#__codelineno-12-23"></a><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">deque</span><span class="o">.</span><span class="n">length</span>
<a id="__codelineno-12-24" name="__codelineno-12-24" href="#__codelineno-12-24"></a>
<a id="__codelineno-12-25" name="__codelineno-12-25" href="#__codelineno-12-25"></a><span class="c1"># 判断双向队列是否为空</span>
<a id="__codelineno-12-26" name="__codelineno-12-26" href="#__codelineno-12-26"></a><span class="n">is_empty</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">size</span><span class="o">.</span><span class="n">zero?</span>
</code></pre></div>
</div>
<div class="tabbed-block">
@@ -5576,7 +5601,7 @@
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">linkedlist_deque.kt</span><pre><span></span><code><a id="__codelineno-25-1" name="__codelineno-25-1" href="#__codelineno-25-1"></a><span class="cm">/* 双向链表节点 */</span>
<a id="__codelineno-25-2" name="__codelineno-25-2" href="#__codelineno-25-2"></a><span class="kd">class</span><span class="w"> </span><span class="nc">ListNode</span><span class="p">(</span><span class="kd">var</span><span class="w"> </span><span class="nv">value</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-2" name="__codelineno-25-2" href="#__codelineno-25-2"></a><span class="kd">class</span><span class="w"> </span><span class="nc">ListNode</span><span class="p">(</span><span class="kd">var</span><span class="w"> </span><span class="nv">_val</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-3" name="__codelineno-25-3" href="#__codelineno-25-3"></a><span class="w"> </span><span class="c1">// 节点值</span>
<a id="__codelineno-25-4" name="__codelineno-25-4" href="#__codelineno-25-4"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">next</span><span class="p">:</span><span class="w"> </span><span class="n">ListNode? </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="c1">// 后继节点引用</span>
<a id="__codelineno-25-5" name="__codelineno-25-5" href="#__codelineno-25-5"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">prev</span><span class="p">:</span><span class="w"> </span><span class="n">ListNode? </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="c1">// 前驱节点引用</span>
@@ -5584,9 +5609,9 @@
<a id="__codelineno-25-7" name="__codelineno-25-7" href="#__codelineno-25-7"></a>
<a id="__codelineno-25-8" name="__codelineno-25-8" href="#__codelineno-25-8"></a><span class="cm">/* 基于双向链表实现的双向队列 */</span>
<a id="__codelineno-25-9" name="__codelineno-25-9" href="#__codelineno-25-9"></a><span class="kd">class</span><span class="w"> </span><span class="nc">LinkedListDeque</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-10" name="__codelineno-25-10" href="#__codelineno-25-10"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">front</span><span class="p">:</span><span class="w"> </span><span class="n">ListNode? </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="c1">// 头节点 front ,尾节点 rear</span>
<a id="__codelineno-25-11" name="__codelineno-25-11" href="#__codelineno-25-11"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">rear</span><span class="p">:</span><span class="w"> </span><span class="n">ListNode? </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span>
<a id="__codelineno-25-12" name="__codelineno-25-12" href="#__codelineno-25-12"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">queSize</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="c1">// 双向队列的长度</span>
<a id="__codelineno-25-10" name="__codelineno-25-10" href="#__codelineno-25-10"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">front</span><span class="p">:</span><span class="w"> </span><span class="n">ListNode? </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="c1">// 头节点 front</span>
<a id="__codelineno-25-11" name="__codelineno-25-11" href="#__codelineno-25-11"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">rear</span><span class="p">:</span><span class="w"> </span><span class="n">ListNode? </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="c1">// 尾节点 rear</span>
<a id="__codelineno-25-12" name="__codelineno-25-12" href="#__codelineno-25-12"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">queSize</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="c1">// 双向队列的长度</span>
<a id="__codelineno-25-13" name="__codelineno-25-13" href="#__codelineno-25-13"></a>
<a id="__codelineno-25-14" name="__codelineno-25-14" href="#__codelineno-25-14"></a><span class="w"> </span><span class="cm">/* 获取双向队列的长度 */</span>
<a id="__codelineno-25-15" name="__codelineno-25-15" href="#__codelineno-25-15"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">size</span><span class="p">():</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="p">{</span>
@@ -5633,12 +5658,12 @@
<a id="__codelineno-25-56" name="__codelineno-25-56" href="#__codelineno-25-56"></a>
<a id="__codelineno-25-57" name="__codelineno-25-57" href="#__codelineno-25-57"></a><span class="w"> </span><span class="cm">/* 出队操作 */</span>
<a id="__codelineno-25-58" name="__codelineno-25-58" href="#__codelineno-25-58"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">pop</span><span class="p">(</span><span class="n">isFront</span><span class="p">:</span><span class="w"> </span><span class="kt">Boolean</span><span class="p">):</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-59" name="__codelineno-25-59" href="#__codelineno-25-59"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isEmpty</span><span class="p">())</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="n">IndexOutOfBoundsException</span><span class="p">()</span>
<a id="__codelineno-25-60" name="__codelineno-25-60" href="#__codelineno-25-60"></a>
<a id="__codelineno-25-59" name="__codelineno-25-59" href="#__codelineno-25-59"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isEmpty</span><span class="p">())</span><span class="w"> </span>
<a id="__codelineno-25-60" name="__codelineno-25-60" href="#__codelineno-25-60"></a><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="n">IndexOutOfBoundsException</span><span class="p">()</span>
<a id="__codelineno-25-61" name="__codelineno-25-61" href="#__codelineno-25-61"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">value</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span>
<a id="__codelineno-25-62" name="__codelineno-25-62" href="#__codelineno-25-62"></a><span class="w"> </span><span class="c1">// 队首出队操作</span>
<a id="__codelineno-25-63" name="__codelineno-25-63" href="#__codelineno-25-63"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isFront</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-64" name="__codelineno-25-64" href="#__codelineno-25-64"></a><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">front</span><span class="o">!!</span><span class="p">.</span><span class="na">value</span><span class="w"> </span><span class="c1">// 暂存头节点值</span>
<a id="__codelineno-25-64" name="__codelineno-25-64" href="#__codelineno-25-64"></a><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">front</span><span class="o">!!</span><span class="p">.</span><span class="na">_val</span><span class="w"> </span><span class="c1">// 暂存头节点值</span>
<a id="__codelineno-25-65" name="__codelineno-25-65" href="#__codelineno-25-65"></a><span class="w"> </span><span class="c1">// 删除头节点</span>
<a id="__codelineno-25-66" name="__codelineno-25-66" href="#__codelineno-25-66"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">fNext</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">front</span><span class="o">!!</span><span class="p">.</span><span class="na">next</span>
<a id="__codelineno-25-67" name="__codelineno-25-67" href="#__codelineno-25-67"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">fNext</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
@@ -5648,7 +5673,7 @@
<a id="__codelineno-25-71" name="__codelineno-25-71" href="#__codelineno-25-71"></a><span class="w"> </span><span class="n">front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fNext</span><span class="w"> </span><span class="c1">// 更新头节点</span>
<a id="__codelineno-25-72" name="__codelineno-25-72" href="#__codelineno-25-72"></a><span class="w"> </span><span class="c1">// 队尾出队操作</span>
<a id="__codelineno-25-73" name="__codelineno-25-73" href="#__codelineno-25-73"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-74" name="__codelineno-25-74" href="#__codelineno-25-74"></a><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rear</span><span class="o">!!</span><span class="p">.</span><span class="na">value</span><span class="w"> </span><span class="c1">// 暂存尾节点值</span>
<a id="__codelineno-25-74" name="__codelineno-25-74" href="#__codelineno-25-74"></a><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rear</span><span class="o">!!</span><span class="p">.</span><span class="na">_val</span><span class="w"> </span><span class="c1">// 暂存尾节点值</span>
<a id="__codelineno-25-75" name="__codelineno-25-75" href="#__codelineno-25-75"></a><span class="w"> </span><span class="c1">// 删除尾节点</span>
<a id="__codelineno-25-76" name="__codelineno-25-76" href="#__codelineno-25-76"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">rPrev</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rear</span><span class="o">!!</span><span class="p">.</span><span class="na">prev</span>
<a id="__codelineno-25-77" name="__codelineno-25-77" href="#__codelineno-25-77"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">rPrev</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
@@ -5673,36 +5698,162 @@
<a id="__codelineno-25-96" name="__codelineno-25-96" href="#__codelineno-25-96"></a>
<a id="__codelineno-25-97" name="__codelineno-25-97" href="#__codelineno-25-97"></a><span class="w"> </span><span class="cm">/* 访问队首元素 */</span>
<a id="__codelineno-25-98" name="__codelineno-25-98" href="#__codelineno-25-98"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">peekFirst</span><span class="p">():</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-99" name="__codelineno-25-99" href="#__codelineno-25-99"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isEmpty</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-100" name="__codelineno-25-100" href="#__codelineno-25-100"></a><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="n">IndexOutOfBoundsException</span><span class="p">()</span>
<a id="__codelineno-25-101" name="__codelineno-25-101" href="#__codelineno-25-101"></a>
<a id="__codelineno-25-102" name="__codelineno-25-102" href="#__codelineno-25-102"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-25-103" name="__codelineno-25-103" href="#__codelineno-25-103"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">front</span><span class="o">!!</span><span class="p">.</span><span class="na">value</span>
<a id="__codelineno-25-104" name="__codelineno-25-104" href="#__codelineno-25-104"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-25-105" name="__codelineno-25-105" href="#__codelineno-25-105"></a>
<a id="__codelineno-25-106" name="__codelineno-25-106" href="#__codelineno-25-106"></a><span class="w"> </span><span class="cm">/* 访问队尾元素 */</span>
<a id="__codelineno-25-107" name="__codelineno-25-107" href="#__codelineno-25-107"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">peekLast</span><span class="p">():</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-108" name="__codelineno-25-108" href="#__codelineno-25-108"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isEmpty</span><span class="p">())</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="n">IndexOutOfBoundsException</span><span class="p">()</span>
<a id="__codelineno-25-109" name="__codelineno-25-109" href="#__codelineno-25-109"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">rear</span><span class="o">!!</span><span class="p">.</span><span class="na">value</span>
<a id="__codelineno-25-110" name="__codelineno-25-110" href="#__codelineno-25-110"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-25-111" name="__codelineno-25-111" href="#__codelineno-25-111"></a>
<a id="__codelineno-25-112" name="__codelineno-25-112" href="#__codelineno-25-112"></a><span class="w"> </span><span class="cm">/* 返回数组用于打印 */</span>
<a id="__codelineno-25-113" name="__codelineno-25-113" href="#__codelineno-25-113"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">toArray</span><span class="p">():</span><span class="w"> </span><span class="n">IntArray</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-114" name="__codelineno-25-114" href="#__codelineno-25-114"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">front</span>
<a id="__codelineno-25-115" name="__codelineno-25-115" href="#__codelineno-25-115"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">IntArray</span><span class="p">(</span><span class="n">size</span><span class="p">())</span>
<a id="__codelineno-25-116" name="__codelineno-25-116" href="#__codelineno-25-116"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="na">indices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-117" name="__codelineno-25-117" href="#__codelineno-25-117"></a><span class="w"> </span><span class="n">res</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="o">!!</span><span class="p">.</span><span class="na">value</span>
<a id="__codelineno-25-118" name="__codelineno-25-118" href="#__codelineno-25-118"></a><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="na">next</span>
<a id="__codelineno-25-119" name="__codelineno-25-119" href="#__codelineno-25-119"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-25-120" name="__codelineno-25-120" href="#__codelineno-25-120"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">res</span>
<a id="__codelineno-25-121" name="__codelineno-25-121" href="#__codelineno-25-121"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-25-122" name="__codelineno-25-122" href="#__codelineno-25-122"></a><span class="p">}</span>
<a id="__codelineno-25-99" name="__codelineno-25-99" href="#__codelineno-25-99"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isEmpty</span><span class="p">())</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="n">IndexOutOfBoundsException</span><span class="p">()</span>
<a id="__codelineno-25-100" name="__codelineno-25-100" href="#__codelineno-25-100"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">front</span><span class="o">!!</span><span class="p">.</span><span class="na">_val</span>
<a id="__codelineno-25-101" name="__codelineno-25-101" href="#__codelineno-25-101"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-25-102" name="__codelineno-25-102" href="#__codelineno-25-102"></a>
<a id="__codelineno-25-103" name="__codelineno-25-103" href="#__codelineno-25-103"></a><span class="w"> </span><span class="cm">/* 访问队尾元素 */</span>
<a id="__codelineno-25-104" name="__codelineno-25-104" href="#__codelineno-25-104"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">peekLast</span><span class="p">():</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-105" name="__codelineno-25-105" href="#__codelineno-25-105"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isEmpty</span><span class="p">())</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="n">IndexOutOfBoundsException</span><span class="p">()</span>
<a id="__codelineno-25-106" name="__codelineno-25-106" href="#__codelineno-25-106"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">rear</span><span class="o">!!</span><span class="p">.</span><span class="na">_val</span>
<a id="__codelineno-25-107" name="__codelineno-25-107" href="#__codelineno-25-107"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-25-108" name="__codelineno-25-108" href="#__codelineno-25-108"></a>
<a id="__codelineno-25-109" name="__codelineno-25-109" href="#__codelineno-25-109"></a><span class="w"> </span><span class="cm">/* 返回数组用于打印 */</span>
<a id="__codelineno-25-110" name="__codelineno-25-110" href="#__codelineno-25-110"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">toArray</span><span class="p">():</span><span class="w"> </span><span class="n">IntArray</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-111" name="__codelineno-25-111" href="#__codelineno-25-111"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">front</span>
<a id="__codelineno-25-112" name="__codelineno-25-112" href="#__codelineno-25-112"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">IntArray</span><span class="p">(</span><span class="n">size</span><span class="p">())</span>
<a id="__codelineno-25-113" name="__codelineno-25-113" href="#__codelineno-25-113"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="na">indices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-25-114" name="__codelineno-25-114" href="#__codelineno-25-114"></a><span class="w"> </span><span class="n">res</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="o">!!</span><span class="p">.</span><span class="na">_val</span>
<a id="__codelineno-25-115" name="__codelineno-25-115" href="#__codelineno-25-115"></a><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="na">next</span>
<a id="__codelineno-25-116" name="__codelineno-25-116" href="#__codelineno-25-116"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-25-117" name="__codelineno-25-117" href="#__codelineno-25-117"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">res</span>
<a id="__codelineno-25-118" name="__codelineno-25-118" href="#__codelineno-25-118"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-25-119" name="__codelineno-25-119" href="#__codelineno-25-119"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">linkedlist_deque.rb</span><pre><span></span><code><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a><span class="o">[</span><span class="n">class</span><span class="o">]</span><span class="p">{</span><span class="no">ListNode</span><span class="p">}</span><span class="o">-[</span><span class="n">func</span><span class="o">]</span><span class="p">{}</span>
<a id="__codelineno-26-2" name="__codelineno-26-2" href="#__codelineno-26-2"></a>
<a id="__codelineno-26-3" name="__codelineno-26-3" href="#__codelineno-26-3"></a><span class="o">[</span><span class="n">class</span><span class="o">]</span><span class="p">{</span><span class="no">LinkedListDeque</span><span class="p">}</span><span class="o">-[</span><span class="n">func</span><span class="o">]</span><span class="p">{}</span>
<div class="highlight"><span class="filename">linkedlist_deque.rb</span><pre><span></span><code><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a><span class="cm">=begin</span>
<a id="__codelineno-26-2" name="__codelineno-26-2" href="#__codelineno-26-2"></a><span class="cm">File: linkedlist_deque.rb</span>
<a id="__codelineno-26-3" name="__codelineno-26-3" href="#__codelineno-26-3"></a><span class="cm">Created Time: 2024-04-06</span>
<a id="__codelineno-26-4" name="__codelineno-26-4" href="#__codelineno-26-4"></a><span class="cm">Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)</span>
<a id="__codelineno-26-5" name="__codelineno-26-5" href="#__codelineno-26-5"></a><span class="cm">=end</span>
<a id="__codelineno-26-6" name="__codelineno-26-6" href="#__codelineno-26-6"></a>
<a id="__codelineno-26-7" name="__codelineno-26-7" href="#__codelineno-26-7"></a><span class="c1">### 双向链表节点</span>
<a id="__codelineno-26-8" name="__codelineno-26-8" href="#__codelineno-26-8"></a><span class="k">class</span><span class="w"> </span><span class="nc">ListNode</span>
<a id="__codelineno-26-9" name="__codelineno-26-9" href="#__codelineno-26-9"></a><span class="w"> </span><span class="kp">attr_accessor</span><span class="w"> </span><span class="ss">:val</span>
<a id="__codelineno-26-10" name="__codelineno-26-10" href="#__codelineno-26-10"></a><span class="w"> </span><span class="kp">attr_accessor</span><span class="w"> </span><span class="ss">:next</span><span class="w"> </span><span class="c1"># 后继节点引用</span>
<a id="__codelineno-26-11" name="__codelineno-26-11" href="#__codelineno-26-11"></a><span class="w"> </span><span class="kp">attr_accessor</span><span class="w"> </span><span class="ss">:prev</span><span class="w"> </span><span class="c1"># 前躯节点引用</span>
<a id="__codelineno-26-12" name="__codelineno-26-12" href="#__codelineno-26-12"></a>
<a id="__codelineno-26-13" name="__codelineno-26-13" href="#__codelineno-26-13"></a><span class="w"> </span><span class="c1">### 构造方法 ###</span>
<a id="__codelineno-26-14" name="__codelineno-26-14" href="#__codelineno-26-14"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">initialize</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<a id="__codelineno-26-15" name="__codelineno-26-15" href="#__codelineno-26-15"></a><span class="w"> </span><span class="vi">@val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span>
<a id="__codelineno-26-16" name="__codelineno-26-16" href="#__codelineno-26-16"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-17" name="__codelineno-26-17" href="#__codelineno-26-17"></a><span class="k">end</span>
<a id="__codelineno-26-18" name="__codelineno-26-18" href="#__codelineno-26-18"></a>
<a id="__codelineno-26-19" name="__codelineno-26-19" href="#__codelineno-26-19"></a><span class="c1">### 基于双向链表实现的双向队列 ###</span>
<a id="__codelineno-26-20" name="__codelineno-26-20" href="#__codelineno-26-20"></a><span class="k">class</span><span class="w"> </span><span class="nc">LinkedListDeque</span>
<a id="__codelineno-26-21" name="__codelineno-26-21" href="#__codelineno-26-21"></a><span class="w"> </span><span class="c1">### 获取双向队列的长度 ###</span>
<a id="__codelineno-26-22" name="__codelineno-26-22" href="#__codelineno-26-22"></a><span class="w"> </span><span class="kp">attr_reader</span><span class="w"> </span><span class="ss">:size</span>
<a id="__codelineno-26-23" name="__codelineno-26-23" href="#__codelineno-26-23"></a>
<a id="__codelineno-26-24" name="__codelineno-26-24" href="#__codelineno-26-24"></a><span class="w"> </span><span class="c1">### 构造方法 ###</span>
<a id="__codelineno-26-25" name="__codelineno-26-25" href="#__codelineno-26-25"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">initialize</span>
<a id="__codelineno-26-26" name="__codelineno-26-26" href="#__codelineno-26-26"></a><span class="w"> </span><span class="vi">@front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">nil</span><span class="w"> </span><span class="c1"># 头节点 front</span>
<a id="__codelineno-26-27" name="__codelineno-26-27" href="#__codelineno-26-27"></a><span class="w"> </span><span class="vi">@rear</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">nil</span><span class="w"> </span><span class="c1"># 尾节点 rear</span>
<a id="__codelineno-26-28" name="__codelineno-26-28" href="#__codelineno-26-28"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="c1"># 双向队列的长度</span>
<a id="__codelineno-26-29" name="__codelineno-26-29" href="#__codelineno-26-29"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-30" name="__codelineno-26-30" href="#__codelineno-26-30"></a>
<a id="__codelineno-26-31" name="__codelineno-26-31" href="#__codelineno-26-31"></a><span class="w"> </span><span class="c1">### 判断双向队列是否为空 ###</span>
<a id="__codelineno-26-32" name="__codelineno-26-32" href="#__codelineno-26-32"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">is_empty?</span>
<a id="__codelineno-26-33" name="__codelineno-26-33" href="#__codelineno-26-33"></a><span class="w"> </span><span class="n">size</span><span class="o">.</span><span class="n">zero?</span>
<a id="__codelineno-26-34" name="__codelineno-26-34" href="#__codelineno-26-34"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-35" name="__codelineno-26-35" href="#__codelineno-26-35"></a>
<a id="__codelineno-26-36" name="__codelineno-26-36" href="#__codelineno-26-36"></a><span class="w"> </span><span class="c1">### 入队操作 ###</span>
<a id="__codelineno-26-37" name="__codelineno-26-37" href="#__codelineno-26-37"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">push</span><span class="p">(</span><span class="n">num</span><span class="p">,</span><span class="w"> </span><span class="n">is_front</span><span class="p">)</span>
<a id="__codelineno-26-38" name="__codelineno-26-38" href="#__codelineno-26-38"></a><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">ListNode</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">num</span><span class="p">)</span>
<a id="__codelineno-26-39" name="__codelineno-26-39" href="#__codelineno-26-39"></a><span class="w"> </span><span class="c1"># 若链表为空, 则令 front 和 rear 都指向 node</span>
<a id="__codelineno-26-40" name="__codelineno-26-40" href="#__codelineno-26-40"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_empty?</span>
<a id="__codelineno-26-41" name="__codelineno-26-41" href="#__codelineno-26-41"></a><span class="w"> </span><span class="vi">@front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@rear</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span>
<a id="__codelineno-26-42" name="__codelineno-26-42" href="#__codelineno-26-42"></a><span class="w"> </span><span class="c1"># 队首入队操作</span>
<a id="__codelineno-26-43" name="__codelineno-26-43" href="#__codelineno-26-43"></a><span class="w"> </span><span class="k">elsif</span><span class="w"> </span><span class="n">is_front</span>
<a id="__codelineno-26-44" name="__codelineno-26-44" href="#__codelineno-26-44"></a><span class="w"> </span><span class="c1"># 将 node 添加至链表头部</span>
<a id="__codelineno-26-45" name="__codelineno-26-45" href="#__codelineno-26-45"></a><span class="w"> </span><span class="vi">@front</span><span class="o">.</span><span class="n">prev</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span>
<a id="__codelineno-26-46" name="__codelineno-26-46" href="#__codelineno-26-46"></a><span class="w"> </span><span class="n">node</span><span class="o">.</span><span class="n">next</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@front</span>
<a id="__codelineno-26-47" name="__codelineno-26-47" href="#__codelineno-26-47"></a><span class="w"> </span><span class="vi">@front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="c1"># 更新头节点</span>
<a id="__codelineno-26-48" name="__codelineno-26-48" href="#__codelineno-26-48"></a><span class="w"> </span><span class="c1"># 队尾入队操作</span>
<a id="__codelineno-26-49" name="__codelineno-26-49" href="#__codelineno-26-49"></a><span class="w"> </span><span class="k">else</span>
<a id="__codelineno-26-50" name="__codelineno-26-50" href="#__codelineno-26-50"></a><span class="w"> </span><span class="c1"># 将 node 添加至链表尾部</span>
<a id="__codelineno-26-51" name="__codelineno-26-51" href="#__codelineno-26-51"></a><span class="w"> </span><span class="vi">@rear</span><span class="o">.</span><span class="n">next</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span>
<a id="__codelineno-26-52" name="__codelineno-26-52" href="#__codelineno-26-52"></a><span class="w"> </span><span class="n">node</span><span class="o">.</span><span class="n">prev</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@rear</span>
<a id="__codelineno-26-53" name="__codelineno-26-53" href="#__codelineno-26-53"></a><span class="w"> </span><span class="vi">@rear</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="c1"># 更新尾节点</span>
<a id="__codelineno-26-54" name="__codelineno-26-54" href="#__codelineno-26-54"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-55" name="__codelineno-26-55" href="#__codelineno-26-55"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="c1"># 更新队列长度</span>
<a id="__codelineno-26-56" name="__codelineno-26-56" href="#__codelineno-26-56"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-57" name="__codelineno-26-57" href="#__codelineno-26-57"></a>
<a id="__codelineno-26-58" name="__codelineno-26-58" href="#__codelineno-26-58"></a><span class="w"> </span><span class="c1">### 队首入队 ###</span>
<a id="__codelineno-26-59" name="__codelineno-26-59" href="#__codelineno-26-59"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">push_first</span><span class="p">(</span><span class="n">num</span><span class="p">)</span>
<a id="__codelineno-26-60" name="__codelineno-26-60" href="#__codelineno-26-60"></a><span class="w"> </span><span class="n">push</span><span class="p">(</span><span class="n">num</span><span class="p">,</span><span class="w"> </span><span class="kp">true</span><span class="p">)</span>
<a id="__codelineno-26-61" name="__codelineno-26-61" href="#__codelineno-26-61"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-62" name="__codelineno-26-62" href="#__codelineno-26-62"></a>
<a id="__codelineno-26-63" name="__codelineno-26-63" href="#__codelineno-26-63"></a><span class="w"> </span><span class="c1">### 队尾入队 ###</span>
<a id="__codelineno-26-64" name="__codelineno-26-64" href="#__codelineno-26-64"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">push_last</span><span class="p">(</span><span class="n">num</span><span class="p">)</span>
<a id="__codelineno-26-65" name="__codelineno-26-65" href="#__codelineno-26-65"></a><span class="w"> </span><span class="n">push</span><span class="p">(</span><span class="n">num</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">)</span>
<a id="__codelineno-26-66" name="__codelineno-26-66" href="#__codelineno-26-66"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-67" name="__codelineno-26-67" href="#__codelineno-26-67"></a>
<a id="__codelineno-26-68" name="__codelineno-26-68" href="#__codelineno-26-68"></a><span class="w"> </span><span class="c1">### 出队操作 ###</span>
<a id="__codelineno-26-69" name="__codelineno-26-69" href="#__codelineno-26-69"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">pop</span><span class="p">(</span><span class="n">is_front</span><span class="p">)</span>
<a id="__codelineno-26-70" name="__codelineno-26-70" href="#__codelineno-26-70"></a><span class="w"> </span><span class="k">raise</span><span class="w"> </span><span class="no">IndexError</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;双向队列为空&#39;</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_empty?</span>
<a id="__codelineno-26-71" name="__codelineno-26-71" href="#__codelineno-26-71"></a>
<a id="__codelineno-26-72" name="__codelineno-26-72" href="#__codelineno-26-72"></a><span class="w"> </span><span class="c1"># 队首出队操作</span>
<a id="__codelineno-26-73" name="__codelineno-26-73" href="#__codelineno-26-73"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_front</span>
<a id="__codelineno-26-74" name="__codelineno-26-74" href="#__codelineno-26-74"></a><span class="w"> </span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@front</span><span class="o">.</span><span class="n">val</span><span class="w"> </span><span class="c1"># 暂存头节点值</span>
<a id="__codelineno-26-75" name="__codelineno-26-75" href="#__codelineno-26-75"></a><span class="w"> </span><span class="c1"># 删除头节点</span>
<a id="__codelineno-26-76" name="__codelineno-26-76" href="#__codelineno-26-76"></a><span class="w"> </span><span class="n">fnext</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@front</span><span class="o">.</span><span class="n">next</span>
<a id="__codelineno-26-77" name="__codelineno-26-77" href="#__codelineno-26-77"></a><span class="w"> </span><span class="k">unless</span><span class="w"> </span><span class="n">fnext</span><span class="o">.</span><span class="n">nil?</span>
<a id="__codelineno-26-78" name="__codelineno-26-78" href="#__codelineno-26-78"></a><span class="w"> </span><span class="n">fnext</span><span class="o">.</span><span class="n">prev</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">nil</span>
<a id="__codelineno-26-79" name="__codelineno-26-79" href="#__codelineno-26-79"></a><span class="w"> </span><span class="vi">@front</span><span class="o">.</span><span class="n">next</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">nil</span>
<a id="__codelineno-26-80" name="__codelineno-26-80" href="#__codelineno-26-80"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-81" name="__codelineno-26-81" href="#__codelineno-26-81"></a><span class="w"> </span><span class="vi">@front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fnext</span><span class="w"> </span><span class="c1"># 更新头节点</span>
<a id="__codelineno-26-82" name="__codelineno-26-82" href="#__codelineno-26-82"></a><span class="w"> </span><span class="c1"># 队尾出队操作</span>
<a id="__codelineno-26-83" name="__codelineno-26-83" href="#__codelineno-26-83"></a><span class="w"> </span><span class="k">else</span>
<a id="__codelineno-26-84" name="__codelineno-26-84" href="#__codelineno-26-84"></a><span class="w"> </span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@rear</span><span class="o">.</span><span class="n">val</span><span class="w"> </span><span class="c1"># 暂存尾节点值</span>
<a id="__codelineno-26-85" name="__codelineno-26-85" href="#__codelineno-26-85"></a><span class="w"> </span><span class="c1"># 删除尾节点</span>
<a id="__codelineno-26-86" name="__codelineno-26-86" href="#__codelineno-26-86"></a><span class="w"> </span><span class="n">rprev</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@rear</span><span class="o">.</span><span class="n">prev</span>
<a id="__codelineno-26-87" name="__codelineno-26-87" href="#__codelineno-26-87"></a><span class="w"> </span><span class="k">unless</span><span class="w"> </span><span class="n">rprev</span><span class="o">.</span><span class="n">nil?</span>
<a id="__codelineno-26-88" name="__codelineno-26-88" href="#__codelineno-26-88"></a><span class="w"> </span><span class="n">rprev</span><span class="o">.</span><span class="n">next</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">nil</span>
<a id="__codelineno-26-89" name="__codelineno-26-89" href="#__codelineno-26-89"></a><span class="w"> </span><span class="vi">@rear</span><span class="o">.</span><span class="n">prev</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">nil</span>
<a id="__codelineno-26-90" name="__codelineno-26-90" href="#__codelineno-26-90"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-91" name="__codelineno-26-91" href="#__codelineno-26-91"></a><span class="w"> </span><span class="vi">@rear</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rprev</span><span class="w"> </span><span class="c1"># 更新尾节点</span>
<a id="__codelineno-26-92" name="__codelineno-26-92" href="#__codelineno-26-92"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-93" name="__codelineno-26-93" href="#__codelineno-26-93"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="c1"># 更新队列长度</span>
<a id="__codelineno-26-94" name="__codelineno-26-94" href="#__codelineno-26-94"></a>
<a id="__codelineno-26-95" name="__codelineno-26-95" href="#__codelineno-26-95"></a><span class="w"> </span><span class="n">val</span>
<a id="__codelineno-26-96" name="__codelineno-26-96" href="#__codelineno-26-96"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-97" name="__codelineno-26-97" href="#__codelineno-26-97"></a>
<a id="__codelineno-26-98" name="__codelineno-26-98" href="#__codelineno-26-98"></a><span class="w"> </span><span class="c1">### 队首出队 ###</span>
<a id="__codelineno-26-99" name="__codelineno-26-99" href="#__codelineno-26-99"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">pop_first</span>
<a id="__codelineno-26-100" name="__codelineno-26-100" href="#__codelineno-26-100"></a><span class="w"> </span><span class="n">pop</span><span class="p">(</span><span class="kp">true</span><span class="p">)</span>
<a id="__codelineno-26-101" name="__codelineno-26-101" href="#__codelineno-26-101"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-102" name="__codelineno-26-102" href="#__codelineno-26-102"></a>
<a id="__codelineno-26-103" name="__codelineno-26-103" href="#__codelineno-26-103"></a><span class="w"> </span><span class="c1">### 队首出队 ###</span>
<a id="__codelineno-26-104" name="__codelineno-26-104" href="#__codelineno-26-104"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">pop_last</span>
<a id="__codelineno-26-105" name="__codelineno-26-105" href="#__codelineno-26-105"></a><span class="w"> </span><span class="n">pop</span><span class="p">(</span><span class="kp">false</span><span class="p">)</span>
<a id="__codelineno-26-106" name="__codelineno-26-106" href="#__codelineno-26-106"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-107" name="__codelineno-26-107" href="#__codelineno-26-107"></a>
<a id="__codelineno-26-108" name="__codelineno-26-108" href="#__codelineno-26-108"></a><span class="w"> </span><span class="c1">### 访问队首元素 ###</span>
<a id="__codelineno-26-109" name="__codelineno-26-109" href="#__codelineno-26-109"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">peek_first</span>
<a id="__codelineno-26-110" name="__codelineno-26-110" href="#__codelineno-26-110"></a><span class="w"> </span><span class="k">raise</span><span class="w"> </span><span class="no">IndexError</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;双向队列为空&#39;</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_empty?</span>
<a id="__codelineno-26-111" name="__codelineno-26-111" href="#__codelineno-26-111"></a>
<a id="__codelineno-26-112" name="__codelineno-26-112" href="#__codelineno-26-112"></a><span class="w"> </span><span class="vi">@front</span><span class="o">.</span><span class="n">val</span>
<a id="__codelineno-26-113" name="__codelineno-26-113" href="#__codelineno-26-113"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-114" name="__codelineno-26-114" href="#__codelineno-26-114"></a>
<a id="__codelineno-26-115" name="__codelineno-26-115" href="#__codelineno-26-115"></a><span class="w"> </span><span class="c1">### 访问队尾元素 ###</span>
<a id="__codelineno-26-116" name="__codelineno-26-116" href="#__codelineno-26-116"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">peek_last</span>
<a id="__codelineno-26-117" name="__codelineno-26-117" href="#__codelineno-26-117"></a><span class="w"> </span><span class="k">raise</span><span class="w"> </span><span class="no">IndexError</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;双向队列为空&#39;</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_empty?</span>
<a id="__codelineno-26-118" name="__codelineno-26-118" href="#__codelineno-26-118"></a>
<a id="__codelineno-26-119" name="__codelineno-26-119" href="#__codelineno-26-119"></a><span class="w"> </span><span class="vi">@rear</span><span class="o">.</span><span class="n">val</span>
<a id="__codelineno-26-120" name="__codelineno-26-120" href="#__codelineno-26-120"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-121" name="__codelineno-26-121" href="#__codelineno-26-121"></a>
<a id="__codelineno-26-122" name="__codelineno-26-122" href="#__codelineno-26-122"></a><span class="w"> </span><span class="c1">### 返回数组用于打印 ###</span>
<a id="__codelineno-26-123" name="__codelineno-26-123" href="#__codelineno-26-123"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">to_array</span>
<a id="__codelineno-26-124" name="__codelineno-26-124" href="#__codelineno-26-124"></a><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@front</span>
<a id="__codelineno-26-125" name="__codelineno-26-125" href="#__codelineno-26-125"></a><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Array</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">size</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<a id="__codelineno-26-126" name="__codelineno-26-126" href="#__codelineno-26-126"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="mi">0</span><span class="o">...</span><span class="n">size</span>
<a id="__codelineno-26-127" name="__codelineno-26-127" href="#__codelineno-26-127"></a><span class="w"> </span><span class="n">res</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="o">.</span><span class="n">val</span>
<a id="__codelineno-26-128" name="__codelineno-26-128" href="#__codelineno-26-128"></a><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="o">.</span><span class="n">next</span>
<a id="__codelineno-26-129" name="__codelineno-26-129" href="#__codelineno-26-129"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-130" name="__codelineno-26-130" href="#__codelineno-26-130"></a><span class="w"> </span><span class="n">res</span>
<a id="__codelineno-26-131" name="__codelineno-26-131" href="#__codelineno-26-131"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-26-132" name="__codelineno-26-132" href="#__codelineno-26-132"></a><span class="k">end</span>
</code></pre></div>
</div>
<div class="tabbed-block">
@@ -7064,11 +7215,11 @@
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">array_deque.kt</span><pre><span></span><code><a id="__codelineno-39-1" name="__codelineno-39-1" href="#__codelineno-39-1"></a><span class="cm">/* 基于环形数组实现的双向队列 */</span>
<div class="highlight"><span class="filename">array_deque.kt</span><pre><span></span><code><a id="__codelineno-39-1" name="__codelineno-39-1" href="#__codelineno-39-1"></a><span class="cm">/* 构造方法 */</span>
<a id="__codelineno-39-2" name="__codelineno-39-2" href="#__codelineno-39-2"></a><span class="kd">class</span><span class="w"> </span><span class="nc">ArrayDeque</span><span class="p">(</span><span class="n">capacity</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-39-3" name="__codelineno-39-3" href="#__codelineno-39-3"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">nums</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">IntArray</span><span class="p">(</span><span class="n">capacity</span><span class="p">)</span><span class="w"> </span><span class="c1">// 用于存储双向队列元素的数组</span>
<a id="__codelineno-39-4" name="__codelineno-39-4" href="#__codelineno-39-4"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="c1">// 队首指针,指向队首元素</span>
<a id="__codelineno-39-5" name="__codelineno-39-5" href="#__codelineno-39-5"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">queSize</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="c1">// 双向队列长度</span>
<a id="__codelineno-39-3" name="__codelineno-39-3" href="#__codelineno-39-3"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">nums</span><span class="p">:</span><span class="w"> </span><span class="n">IntArray</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">IntArray</span><span class="p">(</span><span class="n">capacity</span><span class="p">)</span><span class="w"> </span><span class="c1">// 用于存储双向队列元素的数组</span>
<a id="__codelineno-39-4" name="__codelineno-39-4" href="#__codelineno-39-4"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">front</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="c1">// 队首指针,指向队首元素</span>
<a id="__codelineno-39-5" name="__codelineno-39-5" href="#__codelineno-39-5"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">queSize</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="c1">// 双向队列长度</span>
<a id="__codelineno-39-6" name="__codelineno-39-6" href="#__codelineno-39-6"></a>
<a id="__codelineno-39-7" name="__codelineno-39-7" href="#__codelineno-39-7"></a><span class="w"> </span><span class="cm">/* 获取双向队列的容量 */</span>
<a id="__codelineno-39-8" name="__codelineno-39-8" href="#__codelineno-39-8"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">capacity</span><span class="p">():</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="p">{</span>
@@ -7129,7 +7280,7 @@
<a id="__codelineno-39-63" name="__codelineno-39-63" href="#__codelineno-39-63"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">num</span>
<a id="__codelineno-39-64" name="__codelineno-39-64" href="#__codelineno-39-64"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-39-65" name="__codelineno-39-65" href="#__codelineno-39-65"></a>
<a id="__codelineno-39-66" name="__codelineno-39-66" href="#__codelineno-39-66"></a><span class="w"> </span><span class="cm">/* 访问队尾元素 */</span>
<a id="__codelineno-39-66" name="__codelineno-39-66" href="#__codelineno-39-66"></a><span class="w"> </span><span class="cm">/* 队尾出队 */</span>
<a id="__codelineno-39-67" name="__codelineno-39-67" href="#__codelineno-39-67"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">popLast</span><span class="p">():</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-39-68" name="__codelineno-39-68" href="#__codelineno-39-68"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">num</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">peekLast</span><span class="p">()</span>
<a id="__codelineno-39-69" name="__codelineno-39-69" href="#__codelineno-39-69"></a><span class="w"> </span><span class="n">queSize</span><span class="o">--</span>
@@ -7167,7 +7318,109 @@
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">array_deque.rb</span><pre><span></span><code><a id="__codelineno-40-1" name="__codelineno-40-1" href="#__codelineno-40-1"></a><span class="o">[</span><span class="n">class</span><span class="o">]</span><span class="p">{</span><span class="no">ArrayDeque</span><span class="p">}</span><span class="o">-[</span><span class="n">func</span><span class="o">]</span><span class="p">{}</span>
<div class="highlight"><span class="filename">array_deque.rb</span><pre><span></span><code><a id="__codelineno-40-1" name="__codelineno-40-1" href="#__codelineno-40-1"></a><span class="c1">### 基于环形数组实现的双向队列 ###</span>
<a id="__codelineno-40-2" name="__codelineno-40-2" href="#__codelineno-40-2"></a><span class="k">class</span><span class="w"> </span><span class="nc">ArrayDeque</span>
<a id="__codelineno-40-3" name="__codelineno-40-3" href="#__codelineno-40-3"></a><span class="w"> </span><span class="c1">### 获取双向队列的长度 ###</span>
<a id="__codelineno-40-4" name="__codelineno-40-4" href="#__codelineno-40-4"></a><span class="w"> </span><span class="kp">attr_reader</span><span class="w"> </span><span class="ss">:size</span>
<a id="__codelineno-40-5" name="__codelineno-40-5" href="#__codelineno-40-5"></a>
<a id="__codelineno-40-6" name="__codelineno-40-6" href="#__codelineno-40-6"></a><span class="w"> </span><span class="c1">### 构造方法 ###</span>
<a id="__codelineno-40-7" name="__codelineno-40-7" href="#__codelineno-40-7"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">initialize</span><span class="p">(</span><span class="n">capacity</span><span class="p">)</span>
<a id="__codelineno-40-8" name="__codelineno-40-8" href="#__codelineno-40-8"></a><span class="w"> </span><span class="vi">@nums</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Array</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">capacity</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<a id="__codelineno-40-9" name="__codelineno-40-9" href="#__codelineno-40-9"></a><span class="w"> </span><span class="vi">@front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
<a id="__codelineno-40-10" name="__codelineno-40-10" href="#__codelineno-40-10"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
<a id="__codelineno-40-11" name="__codelineno-40-11" href="#__codelineno-40-11"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-12" name="__codelineno-40-12" href="#__codelineno-40-12"></a>
<a id="__codelineno-40-13" name="__codelineno-40-13" href="#__codelineno-40-13"></a><span class="w"> </span><span class="c1">### 获取双向队列的容量 ###</span>
<a id="__codelineno-40-14" name="__codelineno-40-14" href="#__codelineno-40-14"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">capacity</span>
<a id="__codelineno-40-15" name="__codelineno-40-15" href="#__codelineno-40-15"></a><span class="w"> </span><span class="vi">@nums</span><span class="o">.</span><span class="n">length</span>
<a id="__codelineno-40-16" name="__codelineno-40-16" href="#__codelineno-40-16"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-17" name="__codelineno-40-17" href="#__codelineno-40-17"></a>
<a id="__codelineno-40-18" name="__codelineno-40-18" href="#__codelineno-40-18"></a><span class="w"> </span><span class="c1">### 判断双向队列是否为空 ###</span>
<a id="__codelineno-40-19" name="__codelineno-40-19" href="#__codelineno-40-19"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">is_empty?</span>
<a id="__codelineno-40-20" name="__codelineno-40-20" href="#__codelineno-40-20"></a><span class="w"> </span><span class="n">size</span><span class="o">.</span><span class="n">zero?</span>
<a id="__codelineno-40-21" name="__codelineno-40-21" href="#__codelineno-40-21"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-22" name="__codelineno-40-22" href="#__codelineno-40-22"></a>
<a id="__codelineno-40-23" name="__codelineno-40-23" href="#__codelineno-40-23"></a><span class="w"> </span><span class="c1">### 队首入队 ###</span>
<a id="__codelineno-40-24" name="__codelineno-40-24" href="#__codelineno-40-24"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">push_first</span><span class="p">(</span><span class="n">num</span><span class="p">)</span>
<a id="__codelineno-40-25" name="__codelineno-40-25" href="#__codelineno-40-25"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">capacity</span>
<a id="__codelineno-40-26" name="__codelineno-40-26" href="#__codelineno-40-26"></a><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s1">&#39;双向队列已满&#39;</span>
<a id="__codelineno-40-27" name="__codelineno-40-27" href="#__codelineno-40-27"></a><span class="w"> </span><span class="k">return</span>
<a id="__codelineno-40-28" name="__codelineno-40-28" href="#__codelineno-40-28"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-29" name="__codelineno-40-29" href="#__codelineno-40-29"></a>
<a id="__codelineno-40-30" name="__codelineno-40-30" href="#__codelineno-40-30"></a><span class="w"> </span><span class="c1"># 队首指针向左移动一位</span>
<a id="__codelineno-40-31" name="__codelineno-40-31" href="#__codelineno-40-31"></a><span class="w"> </span><span class="c1"># 通过取余操作实现 front 越过数组头部后回到尾部</span>
<a id="__codelineno-40-32" name="__codelineno-40-32" href="#__codelineno-40-32"></a><span class="w"> </span><span class="vi">@front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="p">(</span><span class="vi">@front</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span>
<a id="__codelineno-40-33" name="__codelineno-40-33" href="#__codelineno-40-33"></a><span class="w"> </span><span class="c1"># 将 num 添加至队首</span>
<a id="__codelineno-40-34" name="__codelineno-40-34" href="#__codelineno-40-34"></a><span class="w"> </span><span class="vi">@nums</span><span class="o">[</span><span class="vi">@front</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">num</span>
<a id="__codelineno-40-35" name="__codelineno-40-35" href="#__codelineno-40-35"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span>
<a id="__codelineno-40-36" name="__codelineno-40-36" href="#__codelineno-40-36"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-37" name="__codelineno-40-37" href="#__codelineno-40-37"></a>
<a id="__codelineno-40-38" name="__codelineno-40-38" href="#__codelineno-40-38"></a><span class="w"> </span><span class="c1">### 队尾入队 ###</span>
<a id="__codelineno-40-39" name="__codelineno-40-39" href="#__codelineno-40-39"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">push_last</span><span class="p">(</span><span class="n">num</span><span class="p">)</span>
<a id="__codelineno-40-40" name="__codelineno-40-40" href="#__codelineno-40-40"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">capacity</span>
<a id="__codelineno-40-41" name="__codelineno-40-41" href="#__codelineno-40-41"></a><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s1">&#39;双向队列已满&#39;</span>
<a id="__codelineno-40-42" name="__codelineno-40-42" href="#__codelineno-40-42"></a><span class="w"> </span><span class="k">return</span>
<a id="__codelineno-40-43" name="__codelineno-40-43" href="#__codelineno-40-43"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-44" name="__codelineno-40-44" href="#__codelineno-40-44"></a>
<a id="__codelineno-40-45" name="__codelineno-40-45" href="#__codelineno-40-45"></a><span class="w"> </span><span class="c1"># 计算队尾指针,指向队尾索引 + 1</span>
<a id="__codelineno-40-46" name="__codelineno-40-46" href="#__codelineno-40-46"></a><span class="w"> </span><span class="n">rear</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="p">(</span><span class="vi">@front</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">size</span><span class="p">)</span>
<a id="__codelineno-40-47" name="__codelineno-40-47" href="#__codelineno-40-47"></a><span class="w"> </span><span class="c1"># 将 num 添加至队尾</span>
<a id="__codelineno-40-48" name="__codelineno-40-48" href="#__codelineno-40-48"></a><span class="w"> </span><span class="vi">@nums</span><span class="o">[</span><span class="n">rear</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">num</span>
<a id="__codelineno-40-49" name="__codelineno-40-49" href="#__codelineno-40-49"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span>
<a id="__codelineno-40-50" name="__codelineno-40-50" href="#__codelineno-40-50"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-51" name="__codelineno-40-51" href="#__codelineno-40-51"></a>
<a id="__codelineno-40-52" name="__codelineno-40-52" href="#__codelineno-40-52"></a><span class="w"> </span><span class="c1">### 队首出队 ###</span>
<a id="__codelineno-40-53" name="__codelineno-40-53" href="#__codelineno-40-53"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">pop_first</span>
<a id="__codelineno-40-54" name="__codelineno-40-54" href="#__codelineno-40-54"></a><span class="w"> </span><span class="n">num</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">peek_first</span>
<a id="__codelineno-40-55" name="__codelineno-40-55" href="#__codelineno-40-55"></a><span class="w"> </span><span class="c1"># 队首指针向后移动一位</span>
<a id="__codelineno-40-56" name="__codelineno-40-56" href="#__codelineno-40-56"></a><span class="w"> </span><span class="vi">@front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="p">(</span><span class="vi">@front</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span>
<a id="__codelineno-40-57" name="__codelineno-40-57" href="#__codelineno-40-57"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span>
<a id="__codelineno-40-58" name="__codelineno-40-58" href="#__codelineno-40-58"></a><span class="w"> </span><span class="n">num</span>
<a id="__codelineno-40-59" name="__codelineno-40-59" href="#__codelineno-40-59"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-60" name="__codelineno-40-60" href="#__codelineno-40-60"></a>
<a id="__codelineno-40-61" name="__codelineno-40-61" href="#__codelineno-40-61"></a><span class="w"> </span><span class="c1">### 队尾出队 ###</span>
<a id="__codelineno-40-62" name="__codelineno-40-62" href="#__codelineno-40-62"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">pop_last</span>
<a id="__codelineno-40-63" name="__codelineno-40-63" href="#__codelineno-40-63"></a><span class="w"> </span><span class="n">num</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">peek_last</span>
<a id="__codelineno-40-64" name="__codelineno-40-64" href="#__codelineno-40-64"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span>
<a id="__codelineno-40-65" name="__codelineno-40-65" href="#__codelineno-40-65"></a><span class="w"> </span><span class="n">num</span>
<a id="__codelineno-40-66" name="__codelineno-40-66" href="#__codelineno-40-66"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-67" name="__codelineno-40-67" href="#__codelineno-40-67"></a>
<a id="__codelineno-40-68" name="__codelineno-40-68" href="#__codelineno-40-68"></a><span class="w"> </span><span class="c1">### 访问队首元素 ###</span>
<a id="__codelineno-40-69" name="__codelineno-40-69" href="#__codelineno-40-69"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">peek_first</span>
<a id="__codelineno-40-70" name="__codelineno-40-70" href="#__codelineno-40-70"></a><span class="w"> </span><span class="k">raise</span><span class="w"> </span><span class="no">IndexError</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;双向队列为空&#39;</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_empty?</span>
<a id="__codelineno-40-71" name="__codelineno-40-71" href="#__codelineno-40-71"></a>
<a id="__codelineno-40-72" name="__codelineno-40-72" href="#__codelineno-40-72"></a><span class="w"> </span><span class="vi">@nums</span><span class="o">[</span><span class="vi">@front</span><span class="o">]</span>
<a id="__codelineno-40-73" name="__codelineno-40-73" href="#__codelineno-40-73"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-74" name="__codelineno-40-74" href="#__codelineno-40-74"></a>
<a id="__codelineno-40-75" name="__codelineno-40-75" href="#__codelineno-40-75"></a><span class="w"> </span><span class="c1">### 访问队尾元素 ###</span>
<a id="__codelineno-40-76" name="__codelineno-40-76" href="#__codelineno-40-76"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">peek_last</span>
<a id="__codelineno-40-77" name="__codelineno-40-77" href="#__codelineno-40-77"></a><span class="w"> </span><span class="k">raise</span><span class="w"> </span><span class="no">IndexError</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;双向队列为空&#39;</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_empty?</span>
<a id="__codelineno-40-78" name="__codelineno-40-78" href="#__codelineno-40-78"></a>
<a id="__codelineno-40-79" name="__codelineno-40-79" href="#__codelineno-40-79"></a><span class="w"> </span><span class="c1"># 计算尾元素索引</span>
<a id="__codelineno-40-80" name="__codelineno-40-80" href="#__codelineno-40-80"></a><span class="w"> </span><span class="n">last</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="p">(</span><span class="vi">@front</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span>
<a id="__codelineno-40-81" name="__codelineno-40-81" href="#__codelineno-40-81"></a><span class="w"> </span><span class="vi">@nums</span><span class="o">[</span><span class="n">last</span><span class="o">]</span>
<a id="__codelineno-40-82" name="__codelineno-40-82" href="#__codelineno-40-82"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-83" name="__codelineno-40-83" href="#__codelineno-40-83"></a>
<a id="__codelineno-40-84" name="__codelineno-40-84" href="#__codelineno-40-84"></a><span class="w"> </span><span class="c1">### 返回数组用于打印 ###</span>
<a id="__codelineno-40-85" name="__codelineno-40-85" href="#__codelineno-40-85"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">to_array</span>
<a id="__codelineno-40-86" name="__codelineno-40-86" href="#__codelineno-40-86"></a><span class="w"> </span><span class="c1"># 仅转换有效长度范围内的列表元素</span>
<a id="__codelineno-40-87" name="__codelineno-40-87" href="#__codelineno-40-87"></a><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[]</span>
<a id="__codelineno-40-88" name="__codelineno-40-88" href="#__codelineno-40-88"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="mi">0</span><span class="o">...</span><span class="n">size</span>
<a id="__codelineno-40-89" name="__codelineno-40-89" href="#__codelineno-40-89"></a><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="vi">@nums</span><span class="o">[</span><span class="n">index</span><span class="p">(</span><span class="vi">@front</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="o">]</span>
<a id="__codelineno-40-90" name="__codelineno-40-90" href="#__codelineno-40-90"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-91" name="__codelineno-40-91" href="#__codelineno-40-91"></a><span class="w"> </span><span class="n">res</span>
<a id="__codelineno-40-92" name="__codelineno-40-92" href="#__codelineno-40-92"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-93" name="__codelineno-40-93" href="#__codelineno-40-93"></a>
<a id="__codelineno-40-94" name="__codelineno-40-94" href="#__codelineno-40-94"></a><span class="w"> </span><span class="kp">private</span>
<a id="__codelineno-40-95" name="__codelineno-40-95" href="#__codelineno-40-95"></a>
<a id="__codelineno-40-96" name="__codelineno-40-96" href="#__codelineno-40-96"></a><span class="w"> </span><span class="c1">### 计算环形数组索引 ###</span>
<a id="__codelineno-40-97" name="__codelineno-40-97" href="#__codelineno-40-97"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">index</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<a id="__codelineno-40-98" name="__codelineno-40-98" href="#__codelineno-40-98"></a><span class="w"> </span><span class="c1"># 通过取余操作实现数组首尾相连</span>
<a id="__codelineno-40-99" name="__codelineno-40-99" href="#__codelineno-40-99"></a><span class="w"> </span><span class="c1"># 当 i 越过数组尾部后,回到头部</span>
<a id="__codelineno-40-100" name="__codelineno-40-100" href="#__codelineno-40-100"></a><span class="w"> </span><span class="c1"># 当 i 越过数组头部后,回到尾部</span>
<a id="__codelineno-40-101" name="__codelineno-40-101" href="#__codelineno-40-101"></a><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">capacity</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span>
<a id="__codelineno-40-102" name="__codelineno-40-102" href="#__codelineno-40-102"></a><span class="w"> </span><span class="k">end</span>
<a id="__codelineno-40-103" name="__codelineno-40-103" href="#__codelineno-40-103"></a><span class="k">end</span>
</code></pre></div>
</div>
<div class="tabbed-block">