この記事では主にPHPデータ構造キュー(SplQueue)と優先キュー(SplPriorityQueue)の簡単な使用例を紹介しますので、必要な方は参考にしてください。それに
キューは、私たちの生活におけるキューと同じように、先入れ先出し(FIFO)という特徴を持った、よりシンプルなデータ構造です。
PHP SPLのSplQueueクラスもスタックと同様にSplDoublyLinkedListを継承することで簡単に実装できます。
SplQueueクラスの概要は以下の通りです。
コードは次のとおりです:
$queue = new SplQueue();
/**
* キューと二重リンクリストの違いは、スタックの IteratorMode が次のようにのみ変更されることであることがわかります。
* (1)SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP (デフォルト値、反復後にデータが保存されます)
* (2)SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE (反復後に削除されるデータ)
*/
$queue->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_DELETE);
//SplQueue::enqueue() は実際には SplDoublyLinkedList::push() です
$queue->enqueue('a');
$queue->enqueue('b');
$queue->enqueue('c');
//SplQueue::dequeue() は実際には SplDoublyLinkedList::shift() です
print_r($queue->dequeue());
foreach($queue as $item) {
echo $item .PHP_EOL;
}
print_r($queue);
プライオリティキューSplPriorityQueueはヒープをベースに実装されています(後述)。
SplPriorityQueueのクラス概要は以下の通りです。
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| $pq = 新しい SplPriorityQueue();
$pq->insert('a', 10); $pq->insert('b', 1); $pq->insert('c', 8);
echo $pq->count() .PHP_EOL; echo $pq->current() .PHP_EOL; /** * 要素デキューモードを設定します * SplPriorityQueue::EXTR_DATA は値のみを抽出します * SplPriorityQueue::EXTR_PRIORITY は優先度のみを抽出します * SplPriorityQueue::EXTR_BOTH は、値と優先度を含む配列を抽出します */ $pq->setExtractFlags(SplPriorityQueue::EXTR_DATA);
while($pq->valid()) { print_r($pq->current()); //a c b $pq->next(); }
|