SplQueue類提供使用雙向鏈表實(shí)現(xiàn)的隊(duì)列的主要功能。
SplQueue從SplDoublyLinkedList繼承

1、有模式的兩個(gè)正交組可以設(shè)置:
1.迭代的方向
SplDoublyLinkedList::IT_MODE_LIFO(堆疊型)
SplDoublyLinkedList::IT_MODE_FIFO(隊(duì)列分格)
2.迭代器的行為
SplDoublyLinkedList::IT_MODE_DELETE(迭代刪除)
SplDoublyLinkedList::IT_MODE_KEEP(迭代遍歷)
默認(rèn)的模式為:SplDoublyLinkedList::IT_MODE_FIFO|SplDoublyLinkedList::IT_MODE_KEEP;
在迭代的方向中,堆疊性的方向是從鏈表的top到bottom(后進(jìn)先出),而隊(duì)列風(fēng)格則相反(先進(jìn)先出)。
在迭代的行為中,迭代刪除會(huì)將鏈表中的元素迭代刪除,而迭代遍歷僅會(huì)將鏈表中的元素遍歷一遍。
2、 SplQueue的方法
__construct — 使用雙向鏈表創(chuàng)建新隊(duì)列
dequeue — 從隊(duì)列中刪除節(jié)點(diǎn)
enqueue — 向隊(duì)列中添加一個(gè)元素
setIteratorMode — 設(shè)置迭代的模式
3、 從SplDoublyLinkedList繼承的方法
add ( mixed $index , mixed $newval ) # 在指定的索引處添加新節(jié)點(diǎn)
bottom ( void ) # 獲取雙鏈表的頭部(底部)的節(jié)點(diǎn)(the first node)(不彈出)
top ( void ) # 獲取雙向鏈表的尾部(頂部)的節(jié)點(diǎn)(the last node)(不彈出)
count ( void ) # 返回雙向鏈表內(nèi)容的數(shù)量
current ( void ) # 返回當(dāng)前節(jié)點(diǎn)的值(the current node)
getIteratorMode ( void ) # 返回迭代模式的值
isEmpty ( void ) # 檢查雙鏈表是否為空
key ( void ) # 返回當(dāng)前節(jié)點(diǎn)的索引值
next ( void ) # 移動(dòng)迭代器到下一個(gè)節(jié)點(diǎn)
offsetExists ( mixed $index ) # 返回請(qǐng)求的索引是否存在
offsetGet ( mixed $index ) # 返回指定索引處的值
offsetSet ( mixed $index , mixed $newval ) # 設(shè)置指定索引處的值為新值
offsetUnset ( mixed $index ) # 刪除指定索引處的節(jié)點(diǎn)(雙鏈表會(huì)重排)
prev ( void ) # 移動(dòng)到上一個(gè)節(jié)點(diǎn)
push ( mixed $value ) # 在雙鏈表的尾部(頂部)追加節(jié)點(diǎn)
rewind ( void ) # 重置迭代器到開始的位置
serialize ( void ) # 返回序列化后的鏈表,形如i:0;:i:4;:i:6;:i:7;:i:8;
setIteratorMode ( int $mode ) # 設(shè)置遍歷模式
pop ( void ) # 彈出雙鏈表的尾部(頂部)的節(jié)點(diǎn)(the last node)
unserialize ( string $serialized ) # 反序列化存儲(chǔ)(沒太搞懂,根據(jù)測(cè)試結(jié)果,反序列化后好像是把原來序列化后的string反序列化后又追加到了該鏈表中了)
shift ( void ) # 彈出雙鏈表的頭部(底部)的節(jié)點(diǎn)(the first node)
unshift ( mixed $value ) # 在雙鏈表的頭部(底部)追加節(jié)點(diǎn)
valid ( void ) # 檢查雙鏈表是否包含更多的節(jié)點(diǎn)
4、演示
4.1 簡單的使用方式
$link = new SplDoublyLinkedList();
$link->push(4);
$link->push(5);
$link->push(6);
$link->push(7);
$link->push(8);
$link->push(9);
echo "雙鏈表的迭代模式為:\n";
$link->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP);
$mode = $link->getIteratorMode();
var_dump($mode);
echo "雙鏈表為:\n";
var_dump($link);
$node = $link->pop(); //彈出,改變鏈表
echo "pop彈出尾部的節(jié)點(diǎn)為:\n";
var_dump($node);
$link->offsetUnset(1);
echo "刪除索引為1的位置的node節(jié)點(diǎn)后的雙鏈表為: \n";
var_dump($link); //鏈表重排
echo "當(dāng)前的節(jié)點(diǎn)在:\n";
$link->rewind();
$current = $link->current();
var_dump($current);
echo "下一個(gè)節(jié)點(diǎn)在:\n";
$link->next();
$next = $link->current();
var_dump($next);
echo "下一個(gè)的上一個(gè)的節(jié)點(diǎn)在:\n";
$link->prev();
$last = $link->current();
var_dump($last);
$shift = $link->shift();
echo "shift值為\n";
var_dump($shift);
var_dump($link); //彈出,改變鏈表
$bottom = $link->bottom();
echo "bottom值為\n";
var_dump($bottom);
var_dump($link); //獲取,未改變鏈表
$top = $link->top();
echo "top值為:\n";
var_dump($top);
var_dump($link); //獲取,未改變鏈表
echo "在雙鏈表的底部追加節(jié)點(diǎn)\n";;
$link->unshift("233333");
var_dump($link); //追加,改變鏈表
echo "在雙鏈表的頂部追加節(jié)點(diǎn)\n";
$link->push("11111");
var_dump($link); //追加,改變鏈表
4.2 理解SplQueue的簡單使用
<?php
class Test {
public static function foo() {
echo 'Test::foo() called'.PHP_EOL;
}
public static function bar() {
echo 'Test::bar() called'.PHP_EOL;
}
public static function msg($msg) {
echo "$msg".PHP_EOL;
}
}
$queue = new SplQueue();
//SplQueue遍歷方向從始至終都是FIFO無需像SplDoublyLinkedList進(jìn)行設(shè)置,只需設(shè)置迭代完成后是否移除元素
$queue->setIteratorMode(SplQueue::IT_MODE_DELETE);
//追加元素到隊(duì)列中
$queue->enqueue(array("Test", "foo"));
$queue->enqueue(array("Test", "bar"));
$queue->enqueue(array("Test", "msg", "Hi there!"));
var_dump($queue);
foreach ($queue as $task) {
if (count($task) > 2) {
list($class, $method, $args) = $task;
echo "class: ".$class."\n";
echo "method: ".$method."\n";
echo "args: ".$args."\n";
$class::$method($args);
} else {
var_dump($task);
list($class, $method) = $task;
echo "class: ".$class."\n";
echo "method: ".$method."\n";
$class::$method();
}
}