1. 程式人生 > >SPL的常用資料結構(2)

SPL的常用資料結構(2)

SPL的常用資料結構--概念

·什麼是資料結構
 -資料結構是計算機儲存、組織資料的方式。資料結構是相互之間存在一種或多種特定關係的資料元素的結合。
 -解決的是軟體開發過程中的資料如何儲存和表示的問題。
·新浪微博裡面某個使用者的資料怎麼存?
舉例:   ====》這就是資料結構
微博id
關注的好友
粉絲
發的微博
個人資訊


·SPL提供哪些資料結構?
 -雙向連結串列、堆疊、佇列、堆、降序堆、升序堆、優先順序佇列、定長陣列、物件容器


1.雙向連結串列

  ·基本概念
  節點1<--訪問-->節點2<--訪問-->節點3  雙向連結串列
  Bottom:最先新增到連結串列中的節點叫做Bottom(底部),也稱為頭部(Head)
  Top:最後新增到連結串列中的節點叫做Top(頭部),也稱為尾部
  連結串列指標:是一個當前關注的節點的標識,可以指向任意節點
  當前節點:連結串列指標指向的節點稱為當前節點


·基本概念
  節點1==細化==》節點名稱/節點資料


  節點名稱:可以在連結串列中唯一標識一個節點的名稱,我們通常稱為節點的key或者offset.
  節點資料:存放在連結串列中的應用資料,我們通常稱為style.


·SplDoublyLinkedList類
·操作
-當前節點操作:rewind、current、next、prev
-增加節點操作:push、unshift
-刪除節點操作:pop、shift
-定位操作:bottom、top
-特定節點操作:offsetExists、offsetGet、offsetSet、offsetUnset


例項:
<?php
$obj = new SplDoublyLinkedList();
//把新的節點資料新增到連結串列的頂部(top)
$obj->push("hello");
$obj->push("2");
$obj->push("3");
//unshift把新的節點資料新增到連結串列底部(Bottom)
$obj->unshift("10");
$obj->rewind();
// rewind操作用於把節點指標指向Bottom所在的節點
// current在別的函式呼叫前是不能被呼叫的 所以在使用current前使用rewind
echo "current:".$obj->current()."<br>";//獲取節點指標指向的節點(當前節點)

$obj->next();
$obj->next();
$obj->pop(); //把Top位置的節點從連結串列中刪除,並返回。如果current正好指向Top位置,那麼呼叫pop之後current會失效


echo "<pre>";
print_r($obj);
echo "</pre>";


echo "next node:".$obj->current()."<br>";
$obj->shift();//把Bottom位置的節點從連結串列中刪除,並返回。


echo "<pre>";
print_r($obj);
echo "</pre>";
?>


2.堆疊

·理解和回顧
最後進入到堆疊裡面的資料最先拿出堆疊(First In Last Out FILO)


·繼承自SplDoublyLinkedList類的SplStack類
·操作
-push:壓入堆疊(存入)
-pop:退出堆疊(取出)


例項:
<?php
$stack = new Splstack();
$stack->push("a"); //push操作向堆疊裡面放入一個節點到top位置
$stack->push("b");
$stack->push("c");
$stack->push("d");


echo "<pre>";
print_r($stack);
echo "</pre>";


echo "Bottom:".$stack->bottom()."<br>";
echo "top:".$stack->top()."<br>";
$stack->offsetSet(0,'D'); //堆疊的offset=0是Top所在的位置,offset=1是top位置節點靠近bottom的相鄰節點,以此類推
echo "<pre>";
print_r($stack);
echo "</pre>";


$stack->rewind(); //雙向連結串列的rewind和堆疊的rewind相反,堆疊的rewind使得當前指標指向Top所在的位置,而雙向連結串列呼叫之後指向bottom所在位置
echo 'current:'.$stack->current()."<br>";


$stack->next(); //堆疊的Next操作使指標指向靠近Bottom位置的下一個節點,而雙向連結串列是靠近top的下一個節點
echo 'current:'.$stack->current()."<br>";


// 遍歷堆疊
$stack->rewind();
while($stack->valid()){
echo $stack->key()."=>".$stack->current()."<br>";
$stack->next(); //next操作不從連結串列中刪除元素
}


// 刪除堆疊資料
$popObj = $stack->pop();//pop操作從堆疊裡面提取出最後一個元素(top位置),同時在堆疊裡面刪除該節點
echo "Poped object:".$popObj."<br>";
echo "<pre>";
print_r($stack);
echo "</pre>";
?>


3.佇列

·佇列和堆疊剛好相反,最先進入佇列的元素會最先走出佇列
-就像排隊打飯,排在最前面的人總是最先能夠打到飯
    ·繼承自SplDoublyLinkedList類的SplQueue類
    ·操作
    -enqueue:進入佇列
    -dequeue:退出佇列


例項:
<?php

$queue = new Splqueue();
$queue->enqueue('a');
$queue->enqueue('b');
$queue->enqueue('c');
echo "<pre>";
print_r($queue);
echo "</pre>";
echo "Bottom:".$queue->bottom()."<br>";
echo "top:".$queue->top()."<br>";


$queue->offsetSet(0,"A");//佇列裡面offset=0是Bottom所在位置,offset=1是Top方向的相鄰節點,以此類推
echo "<pre>";
print_r($queue);
echo "</pre>";


$queue->rewind();//佇列裡面的rewind操作使得指標指向bottom所在位置的節點
echo 'current:'.$queue->current()."<br>";
echo "<pre>";
print_r($queue);
echo "</pre>";


// 遍歷佇列
$queue->rewind();
while($queue->valid()){
echo $queue->key()."=>".$queue->current()."<br>";
$queue->next(); //next操作不從連結串列中刪除元素
}


// 刪除佇列資料
$Obj = $queue->dequeue();//pop操作從堆疊裡面提取出最後一個元素(top位置),同時在堆疊裡面刪除該節點
echo "Poped object:".$Obj."<br>";
echo "<pre>";
print_r($queue);
echo "</pre>";
?>