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 ...
随机推荐
- .Net Core下基于NPOI对Excel、Word操作封装
本库进行了重写,如果需要请转移到下文查看: https://www.cnblogs.com/holdengong/p/10889780.html 框架与依赖 框架:.NET Standard 2.0 ...
- VSCode配置JAVA开发环境
VSCode配置JAVA开发环境 1:给机器安装JDK.MAVEN 下载JDK 下载路径:https://www.oracle.com/technetwork/java/javase/download ...
- 循环队列(Joseplus Problem)
#include <iostream> #include <stdio.h> using namespace std; ]; ; void Enqueue(int x) { ) ...
- Leetcode 566. Reshape the Matrix 矩阵变形(数组,模拟,矩阵操作)
Leetcode 566. Reshape the Matrix 矩阵变形(数组,模拟,矩阵操作) 题目描述 在MATLAB中,reshape是一个非常有用的函数,它可以将矩阵变为另一种形状且保持数据 ...
- 21.Longest Palindromic Substring(最长回文子串)
Level: Medium 题目描述: Given a string s, find the longest palindromic substring in s. You may assume ...
- Unity 动画系统目录 之 Animation
返回 Unity 动画系统目录 官方文档 Animation:https://docs.unity3d.com/ScriptReference/Animation.html Animator:http ...
- JavaScript权威指南--闭包讲解摘记
不积跬步无以至千里,不积小流无以成江河. 关于闭包的解释,在<JavaScript权威指南>中讲的很透彻了.今天看了书中的一个段讲解,更加深了对闭包的理解,特此记下,以备查阅. 在同一个作 ...
- Go语言学习包(1)之bufio包
参考网址: https://blog.csdn.net/wangshubo1989/article/details/70177928
- LeeCode(No2 - Add Two Numbers)
LeeCode是一个有意思的编程网站,主要考察程序员的算法 第二题: You are given two non-empty linked lists representing two non-neg ...
- 读书笔记 - 《黑旗 ISIS的崛起》
不愧是普利策奖的书籍,读起来让人欲罢不能,花了大约四个晚上把此书一气读完.这本书讲述的是“伊斯兰国”ISIS及其前身组织历史,也就是阿布·穆萨卡·扎卡维及其追随者的故事.虽然不是小说,但故事的精彩以及 ...