SPL-隊(duì)列

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();  
    }  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容