php spl数据结构
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数据结构的更多相关文章
- SPL数据结构
数据结构是计算机存储.组织数据的方式. SPL提供了双向链表.堆栈.队列.堆.降序堆.升序堆.优先级队列.定长数组.对象容器. 基本概念Bottom:节点,第一个节点称Bottom:Top:最后添加的 ...
- PHP——大话PHP设计模式——SPL数据结构
- PHP标准库 (SPL) 笔记
简介 SPL是Standard PHP Library(PHP标准库)的缩写. The Standard PHP Library (SPL) is a collection of interfaces ...
- SPL类
用途:对类,方法,属性,参数的提取生成文档:自动加载插件 实列化类同于new:$ref = new ReflectionClass($classname);$class = $ref->newI ...
- 详解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 ...
- Standard PHP Library(SPL)中的数据结构
SPL提供了一组标准数据结构. SplDoublyLinkedList Class:双向链表(DLL)是在两个方向上相互链接的节点列表.当底层结构是dll时,迭代器的操作.对两端的访问.节点的添加或删 ...
- PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题)
PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题) 一.总结 SplStack就是继承双链表(SplDoublyLinkedList)实 ...
- PHP SPL标准库-数据结构
SPL是用于解决典型问题的一组接口与类的集合. 双向链表 SplDoublyLinkedList SplStack SplQueue 双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储 ...
- PHP的SPL扩展库(一)数据结构
SPL 库也叫做 PHP 标准库,主要就是用于解决典型问题的一组接口或类的集合.这些典型问题包括什么呢?比如我们今天要讲的数据结构,还有一些设计模式的实现,就像我们之前讲过的观察者模式相关的接口在 S ...
随机推荐
- 封闭解(Closed-form solution)、解析解(Analytical solution)、数值解(Numerical solution) 释义
转俞夕的博客 (侵删) 1 解析解 解析解(Analytical solution) 就是根据严格的公式推导,给出任意的自变量就可以求出其因变量,也就是问题的解,然后可以利用这些公式计算相应的问题.所 ...
- LINQ和Lambda表达式
前言 前段时间接触了一种新的表达式,但是不知道这个是什么意思,所以就先站在巨人的肩膀用了,现在听师哥说这种写法是Lambda表达式.我一直以为,这个Lambda表达式和LINQ查询有异曲同工之妙,可惜 ...
- js流程控制;常用内置对象
一.流程控制 1.if .if-else.if-else if-else var ji = 20; if(ji >= 20){ console.log('大吉大利,晚上吃鸡') } alert( ...
- 关于javascript数据存储机制的一个案例。
之前在学习js的结合性的时候,我有点不太明白,在网上找到一个比较经典的C语言优先级结合性的案例,就是下边这一个.本想在js之中测试一番,结果竟然发现得出的结果和网上的不一样,这令我百思不得其解,后经高 ...
- SAP ABAP ALV构建动态输出列与构建动态内表(包留备用),包含操作abap元类型表及类
https://blog.csdn.net/zhongguomao/article/details/51095946
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测).链地址法.再哈希.建立公共溢出区 标签: hashmaphashmap冲突解决冲突的方法冲突 2016-0 ...
- XStream -- a simple library to serialize objects to XML and back again
Link :http://xstream.codehaus.org/index.html http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197 ...
- svg 日常操作
创建svg 文件 <svg> </svg> 详解viewBox SVG Viewport.View Box和preserveAspectRatio 形状 标签内的值可以是百 ...
- Go语言基础之18--接口编程
一.接口介绍和定义 1.1 接口定义了一个对象的行为规范 A. 只定义规范,不实现 B. 具体的对象需要实现规范的细节 葵花宝典: 接口就是一层封装,1个例子,封装一个返还浏览器内容的接口.为什么不直 ...
- Spring Cloud 监控相关
因为最近客户提出想监控Spring Cloud运行状况的需求,所以稍稍做了调研.目前了解的方法如下: Eureka Server启动后可以在根目录路径看到所有注册的Eureka Client状况 各个 ...