1.双链表SplDoublyLinkedList

结构如图:

类定义:

SplDoublyLinkedList  implements Iterator   , ArrayAccess   , Countable   {

/* 方法 */

public __construct  ( void ) //构造函数

public void add  ( mixed  $index  , mixed  $newval  )//在特定位置添加值,原位置的值向后退

public mixed bottom  ( void )  //返回链表首值

public int count  ( void )  //链表深度

public mixed current  ( void )//当前指针节点值

public int getIteratorMode  ( void )//获取链表迭代模式,0为链表,
IT_MODE_LIFO (Stack style) SplDoublyLinkedList::IT_MODE_FIFO (Queue style) public bool isEmpty ( void )//判断链表是否为空 public mixed key ( void )//当前节点的键值 public void next ( void )//指针下移 public bool offsetExists ( mixed $index )//判断节点是否存在(通过key值)) public mixed offsetGet ( mixed $index )//获取节点值 public void offsetSet ( mixed $index , mixed $newval )//修改节点值 public void offsetUnset ( mixed $index ) //销毁指定节点,不影响当前节点 public mixed pop ( void )//删除链尾链尾 public void prev ( void )//指针迁移 public void push ( mixed $value )//链尾插入 public void rewind ( void ) //指针初始化 public string serialize ( void ) //序列化链表为字符 public void setIteratorMode ( int $mode )//设置遍历模式 public mixed shift ( void )删除链首 public mixed top ( void )//链表尾 public void unserialize ( string $serialized )//反序列化存储 public void unshift ( mixed $value ) //链首插值 public bool valid ( void ) //判断链表是否有效
}

  测试代码:

<?php

//无参数类型方法的调用
function out($name)
{
global $doub ;
if(is_array($name)){
foreach($name as $value){
echo "$value is:".$doub->$value().PHP_EOL;
}
}else{
echo "$name is:".$doub->$name().PHP_EOL;
}
return ;
}
$echo = array();
$doub = new SplDoublyLinkedList();
$doub->push(1);
$doub->push(2);//从尾节点插入值
$doub->unshift(9);//从首节点插入
$doub->push(4);
$doub->push(5);
$doub->push(6);
$doub->push(7);
$doub->push(8);
$doub->push(11);
$doub->pop();//删除尾节点
$doub->shift();//删除首节点
$doub->rewind(); //初始化当前指针
print_r($doub);
$doub->add(1,10);//在特定位置1插入值
print_r($doub);
$echo = ['count', 'bottom', 'top',
'getIteratorMode', 'serialize',
'current','next','next','next',
'next','current','prev','current','isEmpty'
];
out($echo);
$doub->offsetSet(3,'');
//$doub->offsetUnset(1);
print_r($doub);
out(['current', 'valid']);

  

2.栈SplStack

结构:

栈继承了双向链表的所有方法

<?php
$stack = new SplStack();
$stack->push("hello");
echo 'stack pop is: ' .$stack->pop().PHP_EOL;

3.队列SplQueue

结构图:

继承了双向链表所有方法

另添加了两个方法

mixed dequeue  ( void ) //出队列

void enqueue  ( mixed  $value  ) //入队列
<?php
$queue = new SplQueue();
$queue->enqueue("queue");//入队
$queue->enqueue("second");
echo '出队数据是'.$queue->dequeue();//出队 queue

  

4.堆SplHeap

堆是完全二叉树,且节点值比左右孩子的值大(大顶堆)或者比左右孩子的值小(小顶堆)

大顶堆结构:

类定义:

abstract SplHeap  implements Iterator   , Countable   {

/* 方法 */

public __construct  ( void )

abstract protected int compare  ( mixed  $value1  , mixed  $value2  )//抽象方法,需要在自己的类里实现,通过比较决定是大顶堆还是小顶堆

public int count  ( void )

public mixed current  ( void )

public mixed extract  ( void )

public void insert  ( mixed  $value  )

public bool isEmpty  ( void )

public mixed key  ( void )

public void next  ( void )

public void recoverFromCorruption  ( void )

public void rewind  ( void )

public mixed top  ( void )

public bool valid  ( void )
}

  对堆使用foreach后堆变空(堆内没有数据)

测试代码:

<?php
class MySimpleHeap extends SplHeap
{
//compare()方法用来比较两个元素的大小,绝对他们在堆中的位置
public function compare( $value1, $value2 ) {
return ( $value1 - $value2 );//大顶堆,如果返回$value2-$value1则是小顶堆
}
} $obj = new MySimpleHeap();
$obj->insert( 4 );//向堆中插入数据
$obj->insert( 8 );
$obj->insert( 1 );
$obj->insert( 0 ); echo 'top is:'. $obj->top().PHP_EOL; //8
echo 'count is :'.$obj->count().PHP_EOL; //4
$obj->insert( 6 );
$obj->insert( 7 );
print_r($obj);
echo 'extract:'.$obj->extract().PHP_EOL;//抽取顶节点同时从堆中删除
print_r($obj);
$obj->recoverFromCorruption();//从无序堆恢复
foreach( $obj as $number ) {
echo '=>'. $number.PHP_EOL;
}
print_r($obj);//打印出的堆没有数据,因为对堆使用了foreach

大顶堆:SplMaxHeap ,小顶堆SplMinHeap 继承SplHeap类,把  compar变成私有方法

<?php
$obj = new SplMaxHeap();
$obj->insert( 4 );
$obj->insert( 8 );
$obj->insert( 1 );
$obj->insert( 0 );
echo '/*****大顶堆*****/';
print_r($obj); $obj = new SplMinHeap();
$obj->insert( 4 );
$obj->insert( 8 );
$obj->insert( 1 );
$obj->insert( 0 );
echo '/*****小顶堆*****/';
print_r($obj);

  

除此之外还有优先队列,定长数组,对象存储等结构

php spl数据结构的更多相关文章

  1. SPL数据结构

    数据结构是计算机存储.组织数据的方式. SPL提供了双向链表.堆栈.队列.堆.降序堆.升序堆.优先级队列.定长数组.对象容器. 基本概念Bottom:节点,第一个节点称Bottom:Top:最后添加的 ...

  2. PHP——大话PHP设计模式——SPL数据结构

  3. PHP标准库 (SPL) 笔记

    简介 SPL是Standard PHP Library(PHP标准库)的缩写. The Standard PHP Library (SPL) is a collection of interfaces ...

  4. SPL类

    用途:对类,方法,属性,参数的提取生成文档:自动加载插件 实列化类同于new:$ref = new ReflectionClass($classname);$class = $ref->newI ...

  5. 详解OJ(Online Judge)中PHP代码的提交方法及要点【举例:ZOJ 1001 (A + B Problem)】

    详解OJ(Online Judge)中PHP代码的提交方法及要点 Introduction of How to submit PHP code to Online Judge Systems  Int ...

  6. Standard PHP Library(SPL)中的数据结构

    SPL提供了一组标准数据结构. SplDoublyLinkedList Class:双向链表(DLL)是在两个方向上相互链接的节点列表.当底层结构是dll时,迭代器的操作.对两端的访问.节点的添加或删 ...

  7. PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题)

    PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题) 一.总结 SplStack就是继承双链表(SplDoublyLinkedList)实 ...

  8. PHP SPL标准库-数据结构

    SPL是用于解决典型问题的一组接口与类的集合. 双向链表 SplDoublyLinkedList SplStack SplQueue 双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储 ...

  9. PHP的SPL扩展库(一)数据结构

    SPL 库也叫做 PHP 标准库,主要就是用于解决典型问题的一组接口或类的集合.这些典型问题包括什么呢?比如我们今天要讲的数据结构,还有一些设计模式的实现,就像我们之前讲过的观察者模式相关的接口在 S ...

随机推荐

  1. Flink on Yarn模式启动流程分析

    此文已由作者岳猛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Flink On Yarn 架构 Paste_Image.png 前提条件首先需要配置YARN_CONF_DI ...

  2. MapReduce Kmeans算法含测试数据

    使用时,需要修改K值,args值 运行流程: 先初始化中心点->map中和距离最近的中心点生成一对传入reduce->reduce中把相同key值的存到一起->更新中心点,计算和上一 ...

  3. Python之图片缩放功能实现

    这几天由于有项目在做,自己的学习部分然后没有很充足的时间,但是这些零碎的时间也是很宝贵的,所以还是继续学我的python,我很喜欢这个语言,因为简洁,开发环境简单,更多的事,功能灰常的强大,所以好多有 ...

  4. 5、OpenCV Python ROI和泛洪填充

    __author__ = "WSX" import cv2 as cv import numpy as np #泛洪填充 从一个点开始 ,填充周围和他相似的点,直到遇到一个边界 # ...

  5. 微信小程序强制横屏办法

    最近想学习学习微信小程序开发,本着先设计,再查找具体实现的方法的想法,在进行数据统计时,想着竖屏展示数据会造成重叠,或者数据显示不全而用省略号代替的问题,所以计划采用横屏的方式显示数据表格. 搜索到两 ...

  6. P4332 [SHOI2014]三叉神经树

    \(\color{#0066ff}{ 题目描述 }\) 计算神经学作为新兴的交叉学科近些年来一直是学术界的热点.一种叫做SHOI 的神经组织因为其和近日发现的化合物 SHTSC 的密切联系引起了人们的 ...

  7. P2568 GCD

    \(\color{#0066ff}{ 题目描述 }\) 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. \(\color{#0066ff}{输入格式}\ ...

  8. mybatis主键返回语句 使用方法,就是实体类.getid即可拿到返回的id

    <insert id="insertSelective" parameterType="com.o2o.Content" useGeneratedKeys ...

  9. 3. mybatis # 与 $ 的区别

    mybatis # 与 $ 的区别 1.# % 号必须写在test中 应用场景:模糊查询 配置文档mapper.xml <select id="selectBlogByTitle&qu ...

  10. linode出现以下报错

    Linode Manager 报错 系统重新安装后 解决办法执行  rm -rf ~/.ssh/known_hosts 再继续执行:ssh root@72.14.189.163