雙向鏈表類:SplDoublyLinkedList
1. 增刪節點的方法
push:向鏈表的尾部插入一個節點
pop:獲取鏈表中的尾部節點,並且從鏈表中刪除這個節點;操作不改變當前指針的位置
unshift:向鏈表的頭部插入一個節點
shift:刪除一個鏈表頭部節點
2. 指針操作方法
rewind:使鏈表的當前指針指向鏈表的頭部(即bottom)
current:獲得鏈表當前節點指針指向的元素,必須在調用之前先調用rewind。當指向的節點被刪除之後,會指向一個空節點
next:讓鏈表當前的指針指向下一個節點,curent的返回值隨之改變
bottom:獲得鏈表頭部元素,當前指針位置不變
top:獲得鏈表尾部元素,當前指針位置不變
3.其他方法(用法見堆棧類)
valid:檢查鏈表中是否還存在節點,循環輸出時,可以用作判斷
count:統計鏈表中節點的個數
key:返回當前節點的鍵值
offsetSet :設置指定鍵的值,注意:如鍵爲0,在鏈表中0指向頭部即bottom,在堆棧中指向棧頂。
offunset:註銷指定鍵的值
<?php
/**
* Created by 馬廷廣
* User: 馬廷廣
* Date: 2015/8/5
* Time: 10:52
*/
$obj = new SplDoublyLinkedList();
$obj->push('b');
$obj->push('c');
$obj->unshift('a');
var_dump($obj);
/* array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
}
)
*/
$obj->rewind();
var_dump($obj->current());//string(1) "a"
$obj->next();
var_dump($obj->current());//string(1) "a"
var_dump($obj->bottom());//string(1) "a"
var_dump($obj->top());//string(1) "c"
var_dump($obj->pop());//string(1) "c"
var_dump($obj);
/*
* array(2) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
}
*/
var_dump($obj->shift());//string(1) "a"
var_dump($obj);
/*
* array(1) {
[0]=>
string(1) "b"
}
*/
堆棧類:繼承自SplDoublyLinkedList類的SplStack類
原理:堆棧類的底層是由棧實現的,棧是一種先進後出的數據結構,所以SplStack類的一些繼承自SplDoublyLinkedList類的方法有一些理解上的不同,如rewind方法,spl使用rewind方法後指針將指向圖中的棧頂,push和pop操作的是棧頂元素,unshift和shift操作的是棧底元素
<?php
/**
* Created by 馬廷廣
* User: 馬廷廣
* Date: 2015/8/5
* Time: 11:47
*/
$stack=new SplStack();
$stack->push('a');
$stack->push('b');
$stack->push('c');
echo $stack->count();//3
$stack->rewind();
echo $stack->current();//c
$stack->offsetSet(0,'d');//offsetSet中0指向的是圖中的棧頂,由棧頂向下遞增1,2,3,4
while($stack->valid()){
echo $stack->key()."->".$stack->current();
$stack->next();
}
/*2->d
1->b
0->a
*/
隊列類:繼承自SplDoublyLinkedList類的SplQueue類
enqueue:進入隊列
dequeue:退出隊列
隊列類的rewind,offsetSet等方法類似於鏈表
<?php
/**
* Created by 馬廷廣
* User: 馬廷廣
* Date: 2015/8/5
* Time: 12:36
*/
$obj = new SplQueue();
$obj->enqueue('a');
$obj->enqueue('b');
$obj->enqueue('c');
var_dump($obj);
/* [0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
}
*/
$obj->unshift("d");
$obj->push('e');
var_dump($obj);
/*
* array(5) {
[0]=>
string(1) "d"
[1]=>
string(1) "a"
[2]=>
string(1) "b"
[3]=>
string(1) "c"
[4]=>
string(1) "e"
}
*/
$obj->rewind();
echo $obj->current();//d
$obj->offsetSet(0,'h');
var_dump($obj);
/*
* array(5) {
[0]=>
string(1) "h"
[1]=>
string(1) "a"
[2]=>
string(1) "b"
[3]=>
string(1) "c"
[4]=>
string(1) "e"
}
*/