This commit is contained in:
krahets
2024-03-21 04:22:16 +08:00
parent e5237ad99c
commit 5d9f0e656d
58 changed files with 1238 additions and 1216 deletions

View File

@@ -4328,66 +4328,68 @@
<a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a><span class="kd">class</span> <span class="nc">LinkedListQueue</span> <span class="p">{</span>
<a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></a> <span class="kd">private</span> <span class="kd">var</span> <span class="nv">front</span><span class="p">:</span> <span class="n">ListNode</span><span class="p">?</span> <span class="c1">// 头节点</span>
<a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></a> <span class="kd">private</span> <span class="kd">var</span> <span class="nv">rear</span><span class="p">:</span> <span class="n">ListNode</span><span class="p">?</span> <span class="c1">// 尾节点</span>
<a id="__codelineno-17-5" name="__codelineno-17-5" href="#__codelineno-17-5"></a> <span class="kd">private</span> <span class="kd">var</span> <span class="nv">_size</span> <span class="p">=</span> <span class="mi">0</span>
<a id="__codelineno-17-5" name="__codelineno-17-5" href="#__codelineno-17-5"></a> <span class="kd">private</span> <span class="kd">var</span> <span class="nv">_size</span><span class="p">:</span> <span class="nb">Int</span>
<a id="__codelineno-17-6" name="__codelineno-17-6" href="#__codelineno-17-6"></a>
<a id="__codelineno-17-7" name="__codelineno-17-7" href="#__codelineno-17-7"></a> <span class="kd">init</span><span class="p">()</span> <span class="p">{}</span>
<a id="__codelineno-17-8" name="__codelineno-17-8" href="#__codelineno-17-8"></a>
<a id="__codelineno-17-9" name="__codelineno-17-9" href="#__codelineno-17-9"></a> <span class="cm">/* 获取队列的长度 */</span>
<a id="__codelineno-17-10" name="__codelineno-17-10" href="#__codelineno-17-10"></a> <span class="kd">func</span> <span class="nf">size</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-17-11" name="__codelineno-17-11" href="#__codelineno-17-11"></a> <span class="n">_size</span>
<a id="__codelineno-17-12" name="__codelineno-17-12" href="#__codelineno-17-12"></a> <span class="p">}</span>
<a id="__codelineno-17-13" name="__codelineno-17-13" href="#__codelineno-17-13"></a>
<a id="__codelineno-17-14" name="__codelineno-17-14" href="#__codelineno-17-14"></a> <span class="cm">/* 判断队列是否为空 */</span>
<a id="__codelineno-17-15" name="__codelineno-17-15" href="#__codelineno-17-15"></a> <span class="kd">func</span> <span class="nf">isEmpty</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Bool</span> <span class="p">{</span>
<a id="__codelineno-17-16" name="__codelineno-17-16" href="#__codelineno-17-16"></a> <span class="n">size</span><span class="p">()</span> <span class="p">==</span> <span class="mi">0</span>
<a id="__codelineno-17-17" name="__codelineno-17-17" href="#__codelineno-17-17"></a> <span class="p">}</span>
<a id="__codelineno-17-18" name="__codelineno-17-18" href="#__codelineno-17-18"></a>
<a id="__codelineno-17-19" name="__codelineno-17-19" href="#__codelineno-17-19"></a> <span class="cm">/* 入队 */</span>
<a id="__codelineno-17-20" name="__codelineno-17-20" href="#__codelineno-17-20"></a> <span class="kd">func</span> <span class="nf">push</span><span class="p">(</span><span class="n">num</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-17-21" name="__codelineno-17-21" href="#__codelineno-17-21"></a> <span class="c1">// 在尾节点后添加 num</span>
<a id="__codelineno-17-22" name="__codelineno-17-22" href="#__codelineno-17-22"></a> <span class="kd">let</span> <span class="nv">node</span> <span class="p">=</span> <span class="n">ListNode</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="n">num</span><span class="p">)</span>
<a id="__codelineno-17-23" name="__codelineno-17-23" href="#__codelineno-17-23"></a> <span class="c1">// 如果队列为空,则令头、尾节点都指向该节点</span>
<a id="__codelineno-17-24" name="__codelineno-17-24" href="#__codelineno-17-24"></a> <span class="k">if</span> <span class="n">front</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
<a id="__codelineno-17-25" name="__codelineno-17-25" href="#__codelineno-17-25"></a> <span class="n">front</span> <span class="p">=</span> <span class="n">node</span>
<a id="__codelineno-17-26" name="__codelineno-17-26" href="#__codelineno-17-26"></a> <span class="n">rear</span> <span class="p">=</span> <span class="n">node</span>
<a id="__codelineno-17-27" name="__codelineno-17-27" href="#__codelineno-17-27"></a> <span class="p">}</span>
<a id="__codelineno-17-28" name="__codelineno-17-28" href="#__codelineno-17-28"></a> <span class="c1">// 如果队列不为空,则将该节点添加到尾节点后</span>
<a id="__codelineno-17-29" name="__codelineno-17-29" href="#__codelineno-17-29"></a> <span class="k">else</span> <span class="p">{</span>
<a id="__codelineno-17-30" name="__codelineno-17-30" href="#__codelineno-17-30"></a> <span class="n">rear</span><span class="p">?.</span><span class="n">next</span> <span class="p">=</span> <span class="n">node</span>
<a id="__codelineno-17-31" name="__codelineno-17-31" href="#__codelineno-17-31"></a> <span class="n">rear</span> <span class="p">=</span> <span class="n">node</span>
<a id="__codelineno-17-32" name="__codelineno-17-32" href="#__codelineno-17-32"></a> <span class="p">}</span>
<a id="__codelineno-17-33" name="__codelineno-17-33" href="#__codelineno-17-33"></a> <span class="n">_size</span> <span class="o">+=</span> <span class="mi">1</span>
<a id="__codelineno-17-34" name="__codelineno-17-34" href="#__codelineno-17-34"></a> <span class="p">}</span>
<a id="__codelineno-17-35" name="__codelineno-17-35" href="#__codelineno-17-35"></a>
<a id="__codelineno-17-36" name="__codelineno-17-36" href="#__codelineno-17-36"></a> <span class="cm">/* 出队 */</span>
<a id="__codelineno-17-37" name="__codelineno-17-37" href="#__codelineno-17-37"></a> <span class="p">@</span><span class="n">discardableResult</span>
<a id="__codelineno-17-38" name="__codelineno-17-38" href="#__codelineno-17-38"></a> <span class="kd">func</span> <span class="nf">pop</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-17-39" name="__codelineno-17-39" href="#__codelineno-17-39"></a> <span class="kd">let</span> <span class="nv">num</span> <span class="p">=</span> <span class="n">peek</span><span class="p">()</span>
<a id="__codelineno-17-40" name="__codelineno-17-40" href="#__codelineno-17-40"></a> <span class="c1">// 删除头节点</span>
<a id="__codelineno-17-41" name="__codelineno-17-41" href="#__codelineno-17-41"></a> <span class="n">front</span> <span class="p">=</span> <span class="n">front</span><span class="p">?.</span><span class="n">next</span>
<a id="__codelineno-17-42" name="__codelineno-17-42" href="#__codelineno-17-42"></a> <span class="n">_size</span> <span class="o">-=</span> <span class="mi">1</span>
<a id="__codelineno-17-43" name="__codelineno-17-43" href="#__codelineno-17-43"></a> <span class="k">return</span> <span class="n">num</span>
<a id="__codelineno-17-44" name="__codelineno-17-44" href="#__codelineno-17-44"></a> <span class="p">}</span>
<a id="__codelineno-17-45" name="__codelineno-17-45" href="#__codelineno-17-45"></a>
<a id="__codelineno-17-46" name="__codelineno-17-46" href="#__codelineno-17-46"></a> <span class="cm">/* 访问队首元素 */</span>
<a id="__codelineno-17-47" name="__codelineno-17-47" href="#__codelineno-17-47"></a> <span class="kd">func</span> <span class="nf">peek</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-17-48" name="__codelineno-17-48" href="#__codelineno-17-48"></a> <span class="k">if</span> <span class="bp">isEmpty</span><span class="p">()</span> <span class="p">{</span>
<a id="__codelineno-17-49" name="__codelineno-17-49" href="#__codelineno-17-49"></a> <span class="bp">fatalError</span><span class="p">(</span><span class="s">&quot;队列为空&quot;</span><span class="p">)</span>
<a id="__codelineno-17-50" name="__codelineno-17-50" href="#__codelineno-17-50"></a> <span class="p">}</span>
<a id="__codelineno-17-51" name="__codelineno-17-51" href="#__codelineno-17-51"></a> <span class="k">return</span> <span class="n">front</span><span class="p">!.</span><span class="n">val</span>
<a id="__codelineno-17-52" name="__codelineno-17-52" href="#__codelineno-17-52"></a> <span class="p">}</span>
<a id="__codelineno-17-53" name="__codelineno-17-53" href="#__codelineno-17-53"></a>
<a id="__codelineno-17-54" name="__codelineno-17-54" href="#__codelineno-17-54"></a> <span class="cm">/* 将链表转化为 Array 并返回 */</span>
<a id="__codelineno-17-55" name="__codelineno-17-55" href="#__codelineno-17-55"></a> <span class="kd">func</span> <span class="nf">toArray</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="p">{</span>
<a id="__codelineno-17-56" name="__codelineno-17-56" href="#__codelineno-17-56"></a> <span class="kd">var</span> <span class="nv">node</span> <span class="p">=</span> <span class="n">front</span>
<a id="__codelineno-17-57" name="__codelineno-17-57" href="#__codelineno-17-57"></a> <span class="kd">var</span> <span class="nv">res</span> <span class="p">=</span> <span class="nb">Array</span><span class="p">(</span><span class="n">repeating</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">count</span><span class="p">:</span> <span class="n">size</span><span class="p">())</span>
<a id="__codelineno-17-58" name="__codelineno-17-58" href="#__codelineno-17-58"></a> <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="n">res</span><span class="p">.</span><span class="bp">indices</span> <span class="p">{</span>
<a id="__codelineno-17-59" name="__codelineno-17-59" href="#__codelineno-17-59"></a> <span class="n">res</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="n">node</span><span class="p">!.</span><span class="n">val</span>
<a id="__codelineno-17-60" name="__codelineno-17-60" href="#__codelineno-17-60"></a> <span class="n">node</span> <span class="p">=</span> <span class="n">node</span><span class="p">?.</span><span class="n">next</span>
<a id="__codelineno-17-61" name="__codelineno-17-61" href="#__codelineno-17-61"></a> <span class="p">}</span>
<a id="__codelineno-17-62" name="__codelineno-17-62" href="#__codelineno-17-62"></a> <span class="k">return</span> <span class="n">res</span>
<a id="__codelineno-17-63" name="__codelineno-17-63" href="#__codelineno-17-63"></a> <span class="p">}</span>
<a id="__codelineno-17-64" name="__codelineno-17-64" href="#__codelineno-17-64"></a><span class="p">}</span>
<a id="__codelineno-17-7" name="__codelineno-17-7" href="#__codelineno-17-7"></a> <span class="kd">init</span><span class="p">()</span> <span class="p">{</span>
<a id="__codelineno-17-8" name="__codelineno-17-8" href="#__codelineno-17-8"></a> <span class="n">_size</span> <span class="p">=</span> <span class="mi">0</span>
<a id="__codelineno-17-9" name="__codelineno-17-9" href="#__codelineno-17-9"></a> <span class="p">}</span>
<a id="__codelineno-17-10" name="__codelineno-17-10" href="#__codelineno-17-10"></a>
<a id="__codelineno-17-11" name="__codelineno-17-11" href="#__codelineno-17-11"></a> <span class="cm">/* 获取队列的长度 */</span>
<a id="__codelineno-17-12" name="__codelineno-17-12" href="#__codelineno-17-12"></a> <span class="kd">func</span> <span class="nf">size</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-17-13" name="__codelineno-17-13" href="#__codelineno-17-13"></a> <span class="n">_size</span>
<a id="__codelineno-17-14" name="__codelineno-17-14" href="#__codelineno-17-14"></a> <span class="p">}</span>
<a id="__codelineno-17-15" name="__codelineno-17-15" href="#__codelineno-17-15"></a>
<a id="__codelineno-17-16" name="__codelineno-17-16" href="#__codelineno-17-16"></a> <span class="cm">/* 判断队列是否为空 */</span>
<a id="__codelineno-17-17" name="__codelineno-17-17" href="#__codelineno-17-17"></a> <span class="kd">func</span> <span class="nf">isEmpty</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Bool</span> <span class="p">{</span>
<a id="__codelineno-17-18" name="__codelineno-17-18" href="#__codelineno-17-18"></a> <span class="n">size</span><span class="p">()</span> <span class="p">==</span> <span class="mi">0</span>
<a id="__codelineno-17-19" name="__codelineno-17-19" href="#__codelineno-17-19"></a> <span class="p">}</span>
<a id="__codelineno-17-20" name="__codelineno-17-20" href="#__codelineno-17-20"></a>
<a id="__codelineno-17-21" name="__codelineno-17-21" href="#__codelineno-17-21"></a> <span class="cm">/* 入队 */</span>
<a id="__codelineno-17-22" name="__codelineno-17-22" href="#__codelineno-17-22"></a> <span class="kd">func</span> <span class="nf">push</span><span class="p">(</span><span class="n">num</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-17-23" name="__codelineno-17-23" href="#__codelineno-17-23"></a> <span class="c1">// 在尾节点后添加 num</span>
<a id="__codelineno-17-24" name="__codelineno-17-24" href="#__codelineno-17-24"></a> <span class="kd">let</span> <span class="nv">node</span> <span class="p">=</span> <span class="n">ListNode</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="n">num</span><span class="p">)</span>
<a id="__codelineno-17-25" name="__codelineno-17-25" href="#__codelineno-17-25"></a> <span class="c1">// 如果队列为空,则令头、尾节点都指向该节点</span>
<a id="__codelineno-17-26" name="__codelineno-17-26" href="#__codelineno-17-26"></a> <span class="k">if</span> <span class="n">front</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
<a id="__codelineno-17-27" name="__codelineno-17-27" href="#__codelineno-17-27"></a> <span class="n">front</span> <span class="p">=</span> <span class="n">node</span>
<a id="__codelineno-17-28" name="__codelineno-17-28" href="#__codelineno-17-28"></a> <span class="n">rear</span> <span class="p">=</span> <span class="n">node</span>
<a id="__codelineno-17-29" name="__codelineno-17-29" href="#__codelineno-17-29"></a> <span class="p">}</span>
<a id="__codelineno-17-30" name="__codelineno-17-30" href="#__codelineno-17-30"></a> <span class="c1">// 如果队列不为空,则将该节点添加到尾节点后</span>
<a id="__codelineno-17-31" name="__codelineno-17-31" href="#__codelineno-17-31"></a> <span class="k">else</span> <span class="p">{</span>
<a id="__codelineno-17-32" name="__codelineno-17-32" href="#__codelineno-17-32"></a> <span class="n">rear</span><span class="p">?.</span><span class="n">next</span> <span class="p">=</span> <span class="n">node</span>
<a id="__codelineno-17-33" name="__codelineno-17-33" href="#__codelineno-17-33"></a> <span class="n">rear</span> <span class="p">=</span> <span class="n">node</span>
<a id="__codelineno-17-34" name="__codelineno-17-34" href="#__codelineno-17-34"></a> <span class="p">}</span>
<a id="__codelineno-17-35" name="__codelineno-17-35" href="#__codelineno-17-35"></a> <span class="n">_size</span> <span class="o">+=</span> <span class="mi">1</span>
<a id="__codelineno-17-36" name="__codelineno-17-36" href="#__codelineno-17-36"></a> <span class="p">}</span>
<a id="__codelineno-17-37" name="__codelineno-17-37" href="#__codelineno-17-37"></a>
<a id="__codelineno-17-38" name="__codelineno-17-38" href="#__codelineno-17-38"></a> <span class="cm">/* 出队 */</span>
<a id="__codelineno-17-39" name="__codelineno-17-39" href="#__codelineno-17-39"></a> <span class="p">@</span><span class="n">discardableResult</span>
<a id="__codelineno-17-40" name="__codelineno-17-40" href="#__codelineno-17-40"></a> <span class="kd">func</span> <span class="nf">pop</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-17-41" name="__codelineno-17-41" href="#__codelineno-17-41"></a> <span class="kd">let</span> <span class="nv">num</span> <span class="p">=</span> <span class="n">peek</span><span class="p">()</span>
<a id="__codelineno-17-42" name="__codelineno-17-42" href="#__codelineno-17-42"></a> <span class="c1">// 删除头节点</span>
<a id="__codelineno-17-43" name="__codelineno-17-43" href="#__codelineno-17-43"></a> <span class="n">front</span> <span class="p">=</span> <span class="n">front</span><span class="p">?.</span><span class="n">next</span>
<a id="__codelineno-17-44" name="__codelineno-17-44" href="#__codelineno-17-44"></a> <span class="n">_size</span> <span class="o">-=</span> <span class="mi">1</span>
<a id="__codelineno-17-45" name="__codelineno-17-45" href="#__codelineno-17-45"></a> <span class="k">return</span> <span class="n">num</span>
<a id="__codelineno-17-46" name="__codelineno-17-46" href="#__codelineno-17-46"></a> <span class="p">}</span>
<a id="__codelineno-17-47" name="__codelineno-17-47" href="#__codelineno-17-47"></a>
<a id="__codelineno-17-48" name="__codelineno-17-48" href="#__codelineno-17-48"></a> <span class="cm">/* 访问队首元素 */</span>
<a id="__codelineno-17-49" name="__codelineno-17-49" href="#__codelineno-17-49"></a> <span class="kd">func</span> <span class="nf">peek</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-17-50" name="__codelineno-17-50" href="#__codelineno-17-50"></a> <span class="k">if</span> <span class="bp">isEmpty</span><span class="p">()</span> <span class="p">{</span>
<a id="__codelineno-17-51" name="__codelineno-17-51" href="#__codelineno-17-51"></a> <span class="bp">fatalError</span><span class="p">(</span><span class="s">&quot;队列为空&quot;</span><span class="p">)</span>
<a id="__codelineno-17-52" name="__codelineno-17-52" href="#__codelineno-17-52"></a> <span class="p">}</span>
<a id="__codelineno-17-53" name="__codelineno-17-53" href="#__codelineno-17-53"></a> <span class="k">return</span> <span class="n">front</span><span class="p">!.</span><span class="n">val</span>
<a id="__codelineno-17-54" name="__codelineno-17-54" href="#__codelineno-17-54"></a> <span class="p">}</span>
<a id="__codelineno-17-55" name="__codelineno-17-55" href="#__codelineno-17-55"></a>
<a id="__codelineno-17-56" name="__codelineno-17-56" href="#__codelineno-17-56"></a> <span class="cm">/* 将链表转化为 Array 并返回 */</span>
<a id="__codelineno-17-57" name="__codelineno-17-57" href="#__codelineno-17-57"></a> <span class="kd">func</span> <span class="nf">toArray</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="p">{</span>
<a id="__codelineno-17-58" name="__codelineno-17-58" href="#__codelineno-17-58"></a> <span class="kd">var</span> <span class="nv">node</span> <span class="p">=</span> <span class="n">front</span>
<a id="__codelineno-17-59" name="__codelineno-17-59" href="#__codelineno-17-59"></a> <span class="kd">var</span> <span class="nv">res</span> <span class="p">=</span> <span class="nb">Array</span><span class="p">(</span><span class="n">repeating</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">count</span><span class="p">:</span> <span class="n">size</span><span class="p">())</span>
<a id="__codelineno-17-60" name="__codelineno-17-60" href="#__codelineno-17-60"></a> <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="n">res</span><span class="p">.</span><span class="bp">indices</span> <span class="p">{</span>
<a id="__codelineno-17-61" name="__codelineno-17-61" href="#__codelineno-17-61"></a> <span class="n">res</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="n">node</span><span class="p">!.</span><span class="n">val</span>
<a id="__codelineno-17-62" name="__codelineno-17-62" href="#__codelineno-17-62"></a> <span class="n">node</span> <span class="p">=</span> <span class="n">node</span><span class="p">?.</span><span class="n">next</span>
<a id="__codelineno-17-63" name="__codelineno-17-63" href="#__codelineno-17-63"></a> <span class="p">}</span>
<a id="__codelineno-17-64" name="__codelineno-17-64" href="#__codelineno-17-64"></a> <span class="k">return</span> <span class="n">res</span>
<a id="__codelineno-17-65" name="__codelineno-17-65" href="#__codelineno-17-65"></a> <span class="p">}</span>
<a id="__codelineno-17-66" name="__codelineno-17-66" href="#__codelineno-17-66"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
@@ -5227,71 +5229,69 @@
<div class="highlight"><span class="filename">array_queue.swift</span><pre><span></span><code><a id="__codelineno-29-1" name="__codelineno-29-1" href="#__codelineno-29-1"></a><span class="cm">/* 基于环形数组实现的队列 */</span>
<a id="__codelineno-29-2" name="__codelineno-29-2" href="#__codelineno-29-2"></a><span class="kd">class</span> <span class="nc">ArrayQueue</span> <span class="p">{</span>
<a id="__codelineno-29-3" name="__codelineno-29-3" href="#__codelineno-29-3"></a> <span class="kd">private</span> <span class="kd">var</span> <span class="nv">nums</span><span class="p">:</span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="c1">// 用于存储队列元素的数组</span>
<a id="__codelineno-29-4" name="__codelineno-29-4" href="#__codelineno-29-4"></a> <span class="kd">private</span> <span class="kd">var</span> <span class="nv">front</span> <span class="p">=</span> <span class="mi">0</span> <span class="c1">// 队首指针,指向队首元素</span>
<a id="__codelineno-29-5" name="__codelineno-29-5" href="#__codelineno-29-5"></a> <span class="kd">private</span> <span class="kd">var</span> <span class="nv">queSize</span> <span class="p">=</span> <span class="mi">0</span> <span class="c1">// 队列长度</span>
<a id="__codelineno-29-4" name="__codelineno-29-4" href="#__codelineno-29-4"></a> <span class="kd">private</span> <span class="kd">var</span> <span class="nv">front</span><span class="p">:</span> <span class="nb">Int</span> <span class="c1">// 队首指针,指向队首元素</span>
<a id="__codelineno-29-5" name="__codelineno-29-5" href="#__codelineno-29-5"></a> <span class="kd">private</span> <span class="kd">var</span> <span class="nv">_size</span><span class="p">:</span> <span class="nb">Int</span> <span class="c1">// 队列长度</span>
<a id="__codelineno-29-6" name="__codelineno-29-6" href="#__codelineno-29-6"></a>
<a id="__codelineno-29-7" name="__codelineno-29-7" href="#__codelineno-29-7"></a> <span class="kd">init</span><span class="p">(</span><span class="n">capacity</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-29-8" name="__codelineno-29-8" href="#__codelineno-29-8"></a> <span class="c1">// 初始化数组</span>
<a id="__codelineno-29-9" name="__codelineno-29-9" href="#__codelineno-29-9"></a> <span class="n">nums</span> <span class="p">=</span> <span class="nb">Array</span><span class="p">(</span><span class="n">repeating</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">count</span><span class="p">:</span> <span class="n">capacity</span><span class="p">)</span>
<a id="__codelineno-29-10" name="__codelineno-29-10" href="#__codelineno-29-10"></a> <span class="p">}</span>
<a id="__codelineno-29-11" name="__codelineno-29-11" href="#__codelineno-29-11"></a>
<a id="__codelineno-29-12" name="__codelineno-29-12" href="#__codelineno-29-12"></a> <span class="cm">/* 获取队列的容量 */</span>
<a id="__codelineno-29-13" name="__codelineno-29-13" href="#__codelineno-29-13"></a> <span class="kd">func</span> <span class="nf">capacity</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-29-14" name="__codelineno-29-14" href="#__codelineno-29-14"></a> <span class="n">nums</span><span class="p">.</span><span class="bp">count</span>
<a id="__codelineno-29-15" name="__codelineno-29-15" href="#__codelineno-29-15"></a> <span class="p">}</span>
<a id="__codelineno-29-16" name="__codelineno-29-16" href="#__codelineno-29-16"></a>
<a id="__codelineno-29-17" name="__codelineno-29-17" href="#__codelineno-29-17"></a> <span class="cm">/* 获取队列的长度 */</span>
<a id="__codelineno-29-18" name="__codelineno-29-18" href="#__codelineno-29-18"></a> <span class="kd">func</span> <span class="nf">size</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-29-19" name="__codelineno-29-19" href="#__codelineno-29-19"></a> <span class="n">queSize</span>
<a id="__codelineno-29-20" name="__codelineno-29-20" href="#__codelineno-29-20"></a> <span class="p">}</span>
<a id="__codelineno-29-21" name="__codelineno-29-21" href="#__codelineno-29-21"></a>
<a id="__codelineno-29-22" name="__codelineno-29-22" href="#__codelineno-29-22"></a> <span class="cm">/* 判断队列是否为空 */</span>
<a id="__codelineno-29-23" name="__codelineno-29-23" href="#__codelineno-29-23"></a> <span class="kd">func</span> <span class="nf">isEmpty</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Bool</span> <span class="p">{</span>
<a id="__codelineno-29-24" name="__codelineno-29-24" href="#__codelineno-29-24"></a> <span class="n">queSize</span> <span class="p">==</span> <span class="mi">0</span>
<a id="__codelineno-29-25" name="__codelineno-29-25" href="#__codelineno-29-25"></a> <span class="p">}</span>
<a id="__codelineno-29-26" name="__codelineno-29-26" href="#__codelineno-29-26"></a>
<a id="__codelineno-29-27" name="__codelineno-29-27" href="#__codelineno-29-27"></a> <span class="cm">/* 入队 */</span>
<a id="__codelineno-29-28" name="__codelineno-29-28" href="#__codelineno-29-28"></a> <span class="kd">func</span> <span class="nf">push</span><span class="p">(</span><span class="n">num</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-29-29" name="__codelineno-29-29" href="#__codelineno-29-29"></a> <span class="k">if</span> <span class="n">size</span><span class="p">()</span> <span class="p">==</span> <span class="n">capacity</span><span class="p">()</span> <span class="p">{</span>
<a id="__codelineno-29-30" name="__codelineno-29-30" href="#__codelineno-29-30"></a> <span class="bp">print</span><span class="p">(</span><span class="s">&quot;队列已满&quot;</span><span class="p">)</span>
<a id="__codelineno-29-31" name="__codelineno-29-31" href="#__codelineno-29-31"></a> <span class="k">return</span>
<a id="__codelineno-29-32" name="__codelineno-29-32" href="#__codelineno-29-32"></a> <span class="p">}</span>
<a id="__codelineno-29-33" name="__codelineno-29-33" href="#__codelineno-29-33"></a> <span class="c1">// 计算队尾指针,指向队尾索引 + 1</span>
<a id="__codelineno-29-34" name="__codelineno-29-34" href="#__codelineno-29-34"></a> <span class="c1">// 通过取余操作实现 rear 越过数组尾部后回到头部</span>
<a id="__codelineno-29-35" name="__codelineno-29-35" href="#__codelineno-29-35"></a> <span class="kd">let</span> <span class="nv">rear</span> <span class="p">=</span> <span class="p">(</span><span class="n">front</span> <span class="o">+</span> <span class="n">queSize</span><span class="p">)</span> <span class="o">%</span> <span class="n">capacity</span><span class="p">()</span>
<a id="__codelineno-29-36" name="__codelineno-29-36" href="#__codelineno-29-36"></a> <span class="c1">// 将 num 添加至队尾</span>
<a id="__codelineno-29-37" name="__codelineno-29-37" href="#__codelineno-29-37"></a> <span class="n">nums</span><span class="p">[</span><span class="n">rear</span><span class="p">]</span> <span class="p">=</span> <span class="n">num</span>
<a id="__codelineno-29-38" name="__codelineno-29-38" href="#__codelineno-29-38"></a> <span class="n">queSize</span> <span class="o">+=</span> <span class="mi">1</span>
<a id="__codelineno-29-39" name="__codelineno-29-39" href="#__codelineno-29-39"></a> <span class="p">}</span>
<a id="__codelineno-29-40" name="__codelineno-29-40" href="#__codelineno-29-40"></a>
<a id="__codelineno-29-41" name="__codelineno-29-41" href="#__codelineno-29-41"></a> <span class="cm">/* 出队 */</span>
<a id="__codelineno-29-42" name="__codelineno-29-42" href="#__codelineno-29-42"></a> <span class="p">@</span><span class="n">discardableResult</span>
<a id="__codelineno-29-43" name="__codelineno-29-43" href="#__codelineno-29-43"></a> <span class="kd">func</span> <span class="nf">pop</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-29-44" name="__codelineno-29-44" href="#__codelineno-29-44"></a> <span class="kd">let</span> <span class="nv">num</span> <span class="p">=</span> <span class="n">peek</span><span class="p">()</span>
<a id="__codelineno-29-45" name="__codelineno-29-45" href="#__codelineno-29-45"></a> <span class="c1">// 队首指针向后移动一位,若越过尾部,则返回到数组头部</span>
<a id="__codelineno-29-46" name="__codelineno-29-46" href="#__codelineno-29-46"></a> <span class="n">front</span> <span class="p">=</span> <span class="p">(</span><span class="n">front</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="n">capacity</span><span class="p">()</span>
<a id="__codelineno-29-47" name="__codelineno-29-47" href="#__codelineno-29-47"></a> <span class="n">queSize</span> <span class="o">-=</span> <span class="mi">1</span>
<a id="__codelineno-29-48" name="__codelineno-29-48" href="#__codelineno-29-48"></a> <span class="k">return</span> <span class="n">num</span>
<a id="__codelineno-29-49" name="__codelineno-29-49" href="#__codelineno-29-49"></a> <span class="p">}</span>
<a id="__codelineno-29-50" name="__codelineno-29-50" href="#__codelineno-29-50"></a>
<a id="__codelineno-29-51" name="__codelineno-29-51" href="#__codelineno-29-51"></a> <span class="cm">/* 访问队首元素 */</span>
<a id="__codelineno-29-52" name="__codelineno-29-52" href="#__codelineno-29-52"></a> <span class="kd">func</span> <span class="nf">peek</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-29-53" name="__codelineno-29-53" href="#__codelineno-29-53"></a> <span class="k">if</span> <span class="bp">isEmpty</span><span class="p">()</span> <span class="p">{</span>
<a id="__codelineno-29-54" name="__codelineno-29-54" href="#__codelineno-29-54"></a> <span class="bp">fatalError</span><span class="p">(</span><span class="s">&quot;队列为空&quot;</span><span class="p">)</span>
<a id="__codelineno-29-55" name="__codelineno-29-55" href="#__codelineno-29-55"></a> <span class="p">}</span>
<a id="__codelineno-29-56" name="__codelineno-29-56" href="#__codelineno-29-56"></a> <span class="k">return</span> <span class="n">nums</span><span class="p">[</span><span class="n">front</span><span class="p">]</span>
<a id="__codelineno-29-57" name="__codelineno-29-57" href="#__codelineno-29-57"></a> <span class="p">}</span>
<a id="__codelineno-29-58" name="__codelineno-29-58" href="#__codelineno-29-58"></a>
<a id="__codelineno-29-59" name="__codelineno-29-59" href="#__codelineno-29-59"></a> <span class="cm">/* 返回数组 */</span>
<a id="__codelineno-29-60" name="__codelineno-29-60" href="#__codelineno-29-60"></a> <span class="kd">func</span> <span class="nf">toArray</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="p">{</span>
<a id="__codelineno-29-61" name="__codelineno-29-61" href="#__codelineno-29-61"></a> <span class="c1">// 仅转换有效长度范围内的列表元素</span>
<a id="__codelineno-29-62" name="__codelineno-29-62" href="#__codelineno-29-62"></a> <span class="kd">var</span> <span class="nv">res</span> <span class="p">=</span> <span class="nb">Array</span><span class="p">(</span><span class="n">repeating</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">count</span><span class="p">:</span> <span class="n">queSize</span><span class="p">)</span>
<a id="__codelineno-29-63" name="__codelineno-29-63" href="#__codelineno-29-63"></a> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="k">in</span> <span class="n">sequence</span><span class="p">(</span><span class="bp">first</span><span class="p">:</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">front</span><span class="p">),</span> <span class="n">next</span><span class="p">:</span> <span class="p">{</span> <span class="nv">$0</span> <span class="o">&lt;</span> <span class="kc">self</span><span class="p">.</span><span class="n">queSize</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">?</span> <span class="p">(</span><span class="nv">$0</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nv">$1</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="p">:</span> <span class="kc">nil</span> <span class="p">})</span> <span class="p">{</span>
<a id="__codelineno-29-64" name="__codelineno-29-64" href="#__codelineno-29-64"></a> <span class="n">res</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="n">nums</span><span class="p">[</span><span class="n">j</span> <span class="o">%</span> <span class="n">capacity</span><span class="p">()]</span>
<a id="__codelineno-29-65" name="__codelineno-29-65" href="#__codelineno-29-65"></a> <span class="p">}</span>
<a id="__codelineno-29-66" name="__codelineno-29-66" href="#__codelineno-29-66"></a> <span class="k">return</span> <span class="n">res</span>
<a id="__codelineno-29-67" name="__codelineno-29-67" href="#__codelineno-29-67"></a> <span class="p">}</span>
<a id="__codelineno-29-68" name="__codelineno-29-68" href="#__codelineno-29-68"></a><span class="p">}</span>
<a id="__codelineno-29-10" name="__codelineno-29-10" href="#__codelineno-29-10"></a> <span class="n">front</span> <span class="p">=</span> <span class="mi">0</span>
<a id="__codelineno-29-11" name="__codelineno-29-11" href="#__codelineno-29-11"></a> <span class="n">_size</span> <span class="p">=</span> <span class="mi">0</span>
<a id="__codelineno-29-12" name="__codelineno-29-12" href="#__codelineno-29-12"></a> <span class="p">}</span>
<a id="__codelineno-29-13" name="__codelineno-29-13" href="#__codelineno-29-13"></a>
<a id="__codelineno-29-14" name="__codelineno-29-14" href="#__codelineno-29-14"></a> <span class="cm">/* 获取队列的容量 */</span>
<a id="__codelineno-29-15" name="__codelineno-29-15" href="#__codelineno-29-15"></a> <span class="kd">func</span> <span class="nf">capacity</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-29-16" name="__codelineno-29-16" href="#__codelineno-29-16"></a> <span class="n">nums</span><span class="p">.</span><span class="bp">count</span>
<a id="__codelineno-29-17" name="__codelineno-29-17" href="#__codelineno-29-17"></a> <span class="p">}</span>
<a id="__codelineno-29-18" name="__codelineno-29-18" href="#__codelineno-29-18"></a>
<a id="__codelineno-29-19" name="__codelineno-29-19" href="#__codelineno-29-19"></a> <span class="cm">/* 获取队列的长度 */</span>
<a id="__codelineno-29-20" name="__codelineno-29-20" href="#__codelineno-29-20"></a> <span class="kd">func</span> <span class="nf">size</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-29-21" name="__codelineno-29-21" href="#__codelineno-29-21"></a> <span class="n">_size</span>
<a id="__codelineno-29-22" name="__codelineno-29-22" href="#__codelineno-29-22"></a> <span class="p">}</span>
<a id="__codelineno-29-23" name="__codelineno-29-23" href="#__codelineno-29-23"></a>
<a id="__codelineno-29-24" name="__codelineno-29-24" href="#__codelineno-29-24"></a> <span class="cm">/* 判断队列是否为空 */</span>
<a id="__codelineno-29-25" name="__codelineno-29-25" href="#__codelineno-29-25"></a> <span class="kd">func</span> <span class="nf">isEmpty</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Bool</span> <span class="p">{</span>
<a id="__codelineno-29-26" name="__codelineno-29-26" href="#__codelineno-29-26"></a> <span class="n">size</span><span class="p">()</span> <span class="p">==</span> <span class="mi">0</span>
<a id="__codelineno-29-27" name="__codelineno-29-27" href="#__codelineno-29-27"></a> <span class="p">}</span>
<a id="__codelineno-29-28" name="__codelineno-29-28" href="#__codelineno-29-28"></a>
<a id="__codelineno-29-29" name="__codelineno-29-29" href="#__codelineno-29-29"></a> <span class="cm">/* 入队 */</span>
<a id="__codelineno-29-30" name="__codelineno-29-30" href="#__codelineno-29-30"></a> <span class="kd">func</span> <span class="nf">push</span><span class="p">(</span><span class="n">num</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">{</span>
<a id="__codelineno-29-31" name="__codelineno-29-31" href="#__codelineno-29-31"></a> <span class="k">if</span> <span class="n">size</span><span class="p">()</span> <span class="p">==</span> <span class="n">capacity</span><span class="p">()</span> <span class="p">{</span>
<a id="__codelineno-29-32" name="__codelineno-29-32" href="#__codelineno-29-32"></a> <span class="bp">print</span><span class="p">(</span><span class="s">&quot;队列已满&quot;</span><span class="p">)</span>
<a id="__codelineno-29-33" name="__codelineno-29-33" href="#__codelineno-29-33"></a> <span class="k">return</span>
<a id="__codelineno-29-34" name="__codelineno-29-34" href="#__codelineno-29-34"></a> <span class="p">}</span>
<a id="__codelineno-29-35" name="__codelineno-29-35" href="#__codelineno-29-35"></a> <span class="c1">// 计算队尾指针,指向队尾索引 + 1</span>
<a id="__codelineno-29-36" name="__codelineno-29-36" href="#__codelineno-29-36"></a> <span class="c1">// 通过取余操作实现 rear 越过数组尾部后回到头部</span>
<a id="__codelineno-29-37" name="__codelineno-29-37" href="#__codelineno-29-37"></a> <span class="kd">let</span> <span class="nv">rear</span> <span class="p">=</span> <span class="p">(</span><span class="n">front</span> <span class="o">+</span> <span class="n">size</span><span class="p">())</span> <span class="o">%</span> <span class="n">capacity</span><span class="p">()</span>
<a id="__codelineno-29-38" name="__codelineno-29-38" href="#__codelineno-29-38"></a> <span class="c1">// 将 num 添加至队尾</span>
<a id="__codelineno-29-39" name="__codelineno-29-39" href="#__codelineno-29-39"></a> <span class="n">nums</span><span class="p">[</span><span class="n">rear</span><span class="p">]</span> <span class="p">=</span> <span class="n">num</span>
<a id="__codelineno-29-40" name="__codelineno-29-40" href="#__codelineno-29-40"></a> <span class="n">_size</span> <span class="o">+=</span> <span class="mi">1</span>
<a id="__codelineno-29-41" name="__codelineno-29-41" href="#__codelineno-29-41"></a> <span class="p">}</span>
<a id="__codelineno-29-42" name="__codelineno-29-42" href="#__codelineno-29-42"></a>
<a id="__codelineno-29-43" name="__codelineno-29-43" href="#__codelineno-29-43"></a> <span class="cm">/* 出队 */</span>
<a id="__codelineno-29-44" name="__codelineno-29-44" href="#__codelineno-29-44"></a> <span class="p">@</span><span class="n">discardableResult</span>
<a id="__codelineno-29-45" name="__codelineno-29-45" href="#__codelineno-29-45"></a> <span class="kd">func</span> <span class="nf">pop</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-29-46" name="__codelineno-29-46" href="#__codelineno-29-46"></a> <span class="kd">let</span> <span class="nv">num</span> <span class="p">=</span> <span class="n">peek</span><span class="p">()</span>
<a id="__codelineno-29-47" name="__codelineno-29-47" href="#__codelineno-29-47"></a> <span class="c1">// 队首指针向后移动一位,若越过尾部,则返回到数组头部</span>
<a id="__codelineno-29-48" name="__codelineno-29-48" href="#__codelineno-29-48"></a> <span class="n">front</span> <span class="p">=</span> <span class="p">(</span><span class="n">front</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="n">capacity</span><span class="p">()</span>
<a id="__codelineno-29-49" name="__codelineno-29-49" href="#__codelineno-29-49"></a> <span class="n">_size</span> <span class="o">-=</span> <span class="mi">1</span>
<a id="__codelineno-29-50" name="__codelineno-29-50" href="#__codelineno-29-50"></a> <span class="k">return</span> <span class="n">num</span>
<a id="__codelineno-29-51" name="__codelineno-29-51" href="#__codelineno-29-51"></a> <span class="p">}</span>
<a id="__codelineno-29-52" name="__codelineno-29-52" href="#__codelineno-29-52"></a>
<a id="__codelineno-29-53" name="__codelineno-29-53" href="#__codelineno-29-53"></a> <span class="cm">/* 访问队首元素 */</span>
<a id="__codelineno-29-54" name="__codelineno-29-54" href="#__codelineno-29-54"></a> <span class="kd">func</span> <span class="nf">peek</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="nb">Int</span> <span class="p">{</span>
<a id="__codelineno-29-55" name="__codelineno-29-55" href="#__codelineno-29-55"></a> <span class="k">if</span> <span class="bp">isEmpty</span><span class="p">()</span> <span class="p">{</span>
<a id="__codelineno-29-56" name="__codelineno-29-56" href="#__codelineno-29-56"></a> <span class="bp">fatalError</span><span class="p">(</span><span class="s">&quot;队列为空&quot;</span><span class="p">)</span>
<a id="__codelineno-29-57" name="__codelineno-29-57" href="#__codelineno-29-57"></a> <span class="p">}</span>
<a id="__codelineno-29-58" name="__codelineno-29-58" href="#__codelineno-29-58"></a> <span class="k">return</span> <span class="n">nums</span><span class="p">[</span><span class="n">front</span><span class="p">]</span>
<a id="__codelineno-29-59" name="__codelineno-29-59" href="#__codelineno-29-59"></a> <span class="p">}</span>
<a id="__codelineno-29-60" name="__codelineno-29-60" href="#__codelineno-29-60"></a>
<a id="__codelineno-29-61" name="__codelineno-29-61" href="#__codelineno-29-61"></a> <span class="cm">/* 返回数组 */</span>
<a id="__codelineno-29-62" name="__codelineno-29-62" href="#__codelineno-29-62"></a> <span class="kd">func</span> <span class="nf">toArray</span><span class="p">()</span> <span class="p">-&gt;</span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="p">{</span>
<a id="__codelineno-29-63" name="__codelineno-29-63" href="#__codelineno-29-63"></a> <span class="c1">// 仅转换有效长度范围内的列表元素</span>
<a id="__codelineno-29-64" name="__codelineno-29-64" href="#__codelineno-29-64"></a> <span class="p">(</span><span class="n">front</span> <span class="p">..</span><span class="o">&lt;</span> <span class="n">front</span> <span class="o">+</span> <span class="n">size</span><span class="p">()).</span><span class="bp">map</span> <span class="p">{</span> <span class="n">nums</span><span class="p">[</span><span class="nv">$0</span> <span class="o">%</span> <span class="n">capacity</span><span class="p">()]</span> <span class="p">}</span>
<a id="__codelineno-29-65" name="__codelineno-29-65" href="#__codelineno-29-65"></a> <span class="p">}</span>
<a id="__codelineno-29-66" name="__codelineno-29-66" href="#__codelineno-29-66"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">