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

猜你喜欢

转载自blog.csdn.net/qq402507269/article/details/50792299