phpでスタック構造

2017年7月21日

PHPでスタック構造を実現します。
スタック構造ってのは、後入れ先出しという構造で、後に入れたものを先に取り出す、ビンに小銭を入れていくようなイメージです。
英語で書くと、Last In First Outで、LIFOって言いますね。
ちなみに、キューってのもあって、先入れ先出しという構造で、先に入れたものを先に取り出す、ところてんを押し出すようなイメージです。
こちらは英語で書くと、First In First Outで、FIFOって言います。
スタックに入れて取り出すコードです。


<?php
//配列の準備
$stack = array();
//スタックに追加
array_push($stack, "a");
array_push($stack, "b");
array_push($stack, "c");
//スタックから取り出す
$data1 = array_pop($stack);  // 最後に入れた、cが取り出されます。スタックからcは無くなります。
print_r($stack);
echo "取り出された値は " . $data1 . "です。";
?>

これを実行すると、このような結果になります。


Array
(
    [0] => a
    [1] => b
)

取り出された値は cです。

では、スタックからすべてのデータを取り出して表示する処理を作成してみます。


<?php
//配列の準備
$stack = array();
//スタックに追加
array_push($stack, "a");
array_push($stack, "b");
array_push($stack, "c");

while($data = array_pop($stack)){
    echo $data."\n";
}
?>

実行結果


c
b
a

これだと失敗します。スタックに0を入れた場合に、0とNULLを同じと判断してしまい、失敗します。


<?php
//配列の準備
$stack = array();
//スタックに追加
array_push($stack, "a");
array_push($stack, "b");
array_push($stack, "0");
array_push($stack, "c");

while($data = array_pop($stack)){
    echo $data."\n";
}
?>

実行結果


c

while文の条件文を、NULLじゃない場合は処理をするとします。0とNULLを区別するように、!==を使用します。


<?php
//配列の準備
$stack = array();
//スタックに追加
array_push($stack, "a");
array_push($stack, "b");
array_push($stack, "0");
array_push($stack, "c");

while(($data = array_pop($stack)) !== null){
    echo $data."\n";
}
?>

実行結果


c
0
b
a

キューの場合は、array_shiftで配列を先頭から取り出します。
キューに入れるのは、array_pushで同じです。

php

Posted by mimsys