Подтвердить что ты не робот

Php pop/push/shift/unshift, который используется для очередей и для стеков

В PHP существует два способа использования массива как stack (LIFO)
и два способа использовать их в качестве очереди (FIFO).

Можно реализовать стек с push и pop,
но то же самое можно сделать с помощью unshift и shift.

Аналогичным образом можно реализовать очередь с push и shift,
но то же самое можно сделать с помощью unshift и 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

Итак, какие наборы функций использовать?!

4b9b3361

Ответ 1

Короткий ответ

Для стека используйте push и pop (добавьте в конец, возьмите с конца).

Для очереди используйте push и shift (добавьте в конец, возьмите с начала).

Вопросы

Документация

Рассматривая документацию PHP на сегодняшний день 2016-12-29 для этих функций, мы находим следующее:

Для array_push():
описание упоминает: array_push() рассматривает массив как стек "
и пример использует "$stack" .

Для array_pop():
описание ничего не говорит о стеках или очередях
и пример использует "$stack" .

Для array_shift():
описание ничего не упоминает о стеках или очередях (но упоминания о необходимости переиндексации)
и пример использует "$stack" .

Для array_unshift():
описание ничего не упоминает о стеках или очередях (но упоминания о необходимости переиндексации)
и пример использует "$queue".

Итак, это предполагает использование push и pop для стеков (на основе упоминания в описании)
и предлагает использовать unshift и 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

Для стека s это предполагает использование push и pop: естественная терминология, соответствующая упоминанию в документации и также работающая лучше (что имеет смысл с учетом переиндексации с помощью unshift и shift).

Для очереди s это предполагает использование push и shift, несмотря на упоминание в документации.