ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# SplStack(栈 先进后出) # [SplStack](https://www.php.net/manual/zh/class.splstack.php#class.splstack) > 重写setIteratorMode与\_\_construct方法其他继承自SplDoublyLinkedList类 > SplDoublyLinkedList不同在于SplDoublyLinkedList::rewind();是头部第一个元素,而SplStack::rewind();是尾部最后一个元素 > 遍历时遵循先入后出原则从bottom至top方向 ``` <pre class="calibre17">``` <span class="token">//堆栈,先进后出</span> $stack <span class="token1">=</span> <span class="token5">new</span> <span class="token4">SplStack</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//继承自SplDoublyLinkedList类</span> $stack<span class="token3">[</span><span class="token3">]</span> <span class="token1">=</span> <span class="token6">1</span><span class="token3">;</span><span class="token">//[0=>1]</span> $stack<span class="token3">[</span><span class="token3">]</span> <span class="token1">=</span> <span class="token6">2</span><span class="token3">;</span><span class="token">//[0=>1,1=>2]</span> $stack<span class="token3">[</span><span class="token3">]</span> <span class="token1">=</span> <span class="token6">3</span><span class="token3">;</span><span class="token">//[0=>1,1=>2,2=>3]</span> <span class="token">//$stack->add(4,5); //报错超出偏移量</span> $stack<span class="token1">-</span><span class="token1">></span><span class="token4">add</span><span class="token3">(</span><span class="token6">3</span><span class="token3">,</span><span class="token6">4</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//添加一个元素到尾部</span> $stack<span class="token1">-</span><span class="token1">></span><span class="token4">push</span><span class="token3">(</span><span class="token2">"a"</span><span class="token3">)</span><span class="token3">;</span> $stack<span class="token1">-</span><span class="token1">></span><span class="token4">push</span><span class="token3">(</span><span class="token2">"b"</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//[0=>1,1=>2,2=>3,3=>4,4=>'a',5=>'b']</span> <span class="token">//尾部弹出一个元素</span> echo $stack<span class="token1">-</span><span class="token1">></span><span class="token4">pop</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> echo $stack<span class="token1">-</span><span class="token1">></span><span class="token4">pop</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//[0=>1,1=>2,2=>3,3=>4]</span> $stack<span class="token1">-</span><span class="token1">></span><span class="token4">offsetSet</span><span class="token3">(</span><span class="token6">0</span><span class="token3">,</span><span class="token2">'B'</span><span class="token3">)</span><span class="token3">;</span><span class="token">//等同$stack[0]='B';</span> <span class="token">//[0=>1,1=>2,2=>3,3=>'B']</span> <span class="token">//将指针指向迭代开始处 Iterator</span> <span class="token">//双向链表的rewind和堆栈的rewind相反,堆栈的rewind使得当前指针指向Top所在的位置,而双向链表调用之后指向bottom所在位置</span> $stack<span class="token1">-</span><span class="token1">></span><span class="token4">rewind</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> echo <span class="token2">'current:'</span><span class="token3">.</span>$stack<span class="token1">-</span><span class="token1">></span><span class="token4">current</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//current:B</span> $stack<span class="token1">-</span><span class="token1">></span><span class="token4">next</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//堆栈的next操作使指针指向靠近bottom位置的下一个节点,而双向链表是靠近top的下一个节点</span> echo <span class="token2">'current:'</span><span class="token3">.</span>$stack<span class="token1">-</span><span class="token1">></span><span class="token4">current</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//current:3</span> $stack<span class="token1">-</span><span class="token1">></span><span class="token4">rewind</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token5">while</span><span class="token3">(</span>$stack<span class="token1">-</span><span class="token1">></span><span class="token4">valid</span><span class="token3">(</span><span class="token3">)</span><span class="token3">)</span><span class="token3">{</span> echo $stack<span class="token1">-</span><span class="token1">></span><span class="token4">current</span><span class="token3">(</span><span class="token3">)</span><span class="token3">,</span><span class="token2">"\n"</span><span class="token3">;</span> $stack<span class="token1">-</span><span class="token1">></span><span class="token4">next</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//B 3 2 1 </span> <span class="token3">}</span> <span class="token5">for</span> <span class="token3">(</span>$stack<span class="token1">-</span><span class="token1">></span><span class="token4">rewind</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $stack<span class="token1">-</span><span class="token1">></span><span class="token4">valid</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $stack<span class="token1">-</span><span class="token1">></span><span class="token4">next</span><span class="token3">(</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> echo $stack<span class="token1">-</span><span class="token1">></span><span class="token4">current</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//B 3 2 1</span> <span class="token3">}</span> ``` ```