ことさら−古都プログラマーの更級日記

京都でお寺を回りながら御朱印集めをしていたり、LoLをしたり試合を見に行ったりしているエンジニアのブログです。技術的なはなしとか日常的なはなし、カメラやLoLや競馬の話も書きます。右メニューに検索やらカテゴリーやらがあるので、見たい記事だけ見てね!

PHPにおけるStackとQueue

PHP競技プログラミングをする時などにQueueやStackを使う場合があると思います。PHPのStackとQueueについて紹介していきます。

Stack

arrayを使って実装

PHPのarrayは高機能で、array_push, array_pop メソッドを使ってStackを実装することができます。

<?php

class Stack {
    private $array = [];

    public function push($v) {
        array_push($this->array, $v);
    }

    public function pop() {
        return array_pop($this->array);
    }
}

$s = new Stack();
$s->push(1);
$s->push(2);
var_dump($s->pop()); // => int(2)
var_dump($s->pop()); // => int(1)
var_dump($s->pop()); // => NULL

SplStackを使う

SplStackというものもあります。

$s = new SplStack();
$s->push(1);
$s->push(2);
var_dump($s->pop()); // => int(2)
var_dump($s->pop()); // => int(1)
var_dump($s->pop()); // => PHP Fatal error:  Uncaught exception 'RuntimeException' with message 'Can't pop from an empty datastructure'

Queue

arrayを使って実装

array_pusharray_shift を使って実装できます。

class Queue {
    private $array = [];

    public function enqueue($v) {
        array_push($this->array, $v);
    }

    public function dequeue() {
        return array_shift($this->array);
    }
}

$q = new Queue();
$q->enqueue(1);
$q->enqueue(2);
var_dump($q->dequeue()); // => int(1)
var_dump($q->dequeue()); // => int(2)
var_dump($q->dequeue()); // => NULL

SplQueue を利用

$q = new SplQueue();
$q->enqueue(1);
$q->enqueue(2);
var_dump($q->dequeue()); // => int(1)
var_dump($q->dequeue()); // => int(2)
var_dump($q->dequeue()); // => Uncaught exception 'RuntimeException' with message 'Can't shift from an empty datastructure'