您的位置:首页 > 理论基础 > 数据结构算法

SPL的常用数据结构(2)

2016-03-03 22:37 363 查看

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

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: