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>";
?>