php pop / push / shift / unshift,用于队列和堆栈

时间:2016-12-29 20:59:19

标签: php stack queue

在PHP中,有两种方法可以将数组用作堆栈(LIFO)
以及两种将它们用作队列(FIFO)的方法。

可以使用push&实现堆栈 pop
但同样可以使用unshift& shift

同样,人们可以使用push&amp;和<{1}}来实现队列shift
但同样可以使用unshift&amp; pop

演示:

echo "stack push & pop approach:\n";
$s = []; array_push($s, 'first'); array_push($s, 'second'); array_push($s, 'third');
echo     array_pop($s) . '-' .    array_pop($s) . '-' .     array_pop($s) .  "\n";
echo "stack unshift & shift approach:\n";
$s = []; array_unshift($s, 'first'); array_unshift($s, 'second'); array_unshift($s, 'third');
echo     array_shift($s) . '-' .     array_shift($s) . '-' .      array_shift($s) .  "\n";
echo "queue push & shift approach:\n";
$q = []; array_push($q, 'first'); array_push($q, 'second'); array_push($q, 'third');
echo     array_shift($q) . '-' .  array_shift($q) . '-' .   array_shift($q) .  "\n";
echo "queue unshift & pop approach:\n";
$q = []; array_unshift($q, 'first'); array_unshift($q, 'second'); array_unshift($q, 'third');
echo     array_pop($q) . '-' .       array_pop($q) . '-' .        array_pop($q) .       "\n";

哪个输出:

stack push & pop approach:
third-second-first
stack unshift & shift approach:
third-second-first
queue push & shift approach:
first-second-third
queue unshift & pop approach:
first-second-third

那么使用哪些功能集?!

1 个答案:

答案 0 :(得分:2)

简短回答

对于堆栈,请使用push&amp; pop(添加到最后,从结尾开始)。

对于队列,请使用push&amp; shift(加上结束,从头开始)。

考虑

文档

在考虑今天2016-12-29的PHP文档时,我们发现这些:

对于array_push()
说明提及&#34; array_push()将数组视为堆栈&#34;
示例使用&#34; $stack &#34;。

对于array_pop()
描述在堆栈或队列中没有提及任何内容 示例使用&#34; $stack &#34;。

对于array_shift()
描述在堆栈或队列中没有提及任何内容(但提到需要重新编制索引) 示例使用&#34; $stack &#34;。

对于array_unshift()
描述在堆栈或队列中没有提及任何内容(但提到需要重新编制索引) 示例使用&#34; $queue &#34;。

所以这表明使用push&amp;堆栈pop(基于描述中的提及)
并建议使用unshift&amp; pop用于队列(基于示例中仅提及队列)。

这看起来有点薄......这里提交了改进文档的建议:https://bugs.php.net/bug.php?id=73839

效果

运行此:

echo "\nstack push & pop approach     :  ";
$a=[];$i=0;$t=microtime(true); while($i<100000) { array_push($a, 'dummy'); array_pop($a); ++$i; }; echo (microtime(true) - $t);
echo "\nstack unshift & shift approach:  ";
$a=[];$i=0;$t=microtime(true); while($i<100000) { array_unshift($a, 'dummy'); array_shift($a); ++$i; }; echo (microtime(true) - $t);
echo "\nqueue push & shift approach   :  ";
$a=[];$i=0;$t=microtime(true); while($i<100000) { array_push($a, 'dummy'); array_shift($a); ++$i; }; echo (microtime(true) - $t);
echo "\nqueue unshift & pop approach  :  ";
$a=[];$i=0;$t=microtime(true); while($i<100000) { array_unshift($a, 'dummy'); array_pop($a); ++$i; }; echo (microtime(true) - $t);

返回:

stack push & pop approach     :  0.011210918426514
stack unshift & shift approach:  0.015399217605591
queue push & shift approach   :  0.011627912521362
queue unshift & pop approach  :  0.015273094177246

对于堆栈,这建议使用push&amp; pop:自然术语,与文档中的提及相匹配,也表现更好(考虑到unshiftshift重新编制索引,这是有道理的。)

对于队列,这建议使用push&amp; shift,尽管文档中提到过。