1.双链表SplDoublyLinkedList

结构如图:

类定义:

  1. SplDoublyLinkedList implements Iterator , ArrayAccess , Countable {
  2.  
  3. /* 方法 */
  4.  
  5. public __construct ( void ) //构造函数
  6.  
  7. public void add ( mixed $index , mixed $newval )//在特定位置添加值,原位置的值向后退
  8.  
  9. public mixed bottom ( void ) //返回链表首值
  10.  
  11. public int count ( void ) //链表深度
  12.  
  13. public mixed current ( void )//当前指针节点值
  14.  
  15. public int getIteratorMode ( void )//获取链表迭代模式,0为链表,
  16. IT_MODE_LIFO (Stack style) SplDoublyLinkedList::IT_MODE_FIFO (Queue style)
  17.  
  18. public bool isEmpty ( void )//判断链表是否为空
  19.  
  20. public mixed key ( void )//当前节点的键值
  21.  
  22. public void next ( void )//指针下移
  23.  
  24. public bool offsetExists ( mixed $index )//判断节点是否存在(通过key值))
  25.  
  26. public mixed offsetGet ( mixed $index )//获取节点值
  27.  
  28. public void offsetSet ( mixed $index , mixed $newval )//修改节点值
  29.  
  30. public void offsetUnset ( mixed $index ) //销毁指定节点,不影响当前节点
  31.  
  32. public mixed pop ( void )//删除链尾链尾
  33.  
  34. public void prev ( void )//指针迁移
  35.  
  36. public void push ( mixed $value )//链尾插入
  37.  
  38. public void rewind ( void ) //指针初始化
  39.  
  40. public string serialize ( void ) //序列化链表为字符
  41.  
  42. public void setIteratorMode ( int $mode )//设置遍历模式
  43.  
  44. public mixed shift ( void )删除链首
  45.  
  46. public mixed top ( void )//链表尾
  47.  
  48. public void unserialize ( string $serialized )//反序列化存储
  49.  
  50. public void unshift ( mixed $value ) //链首插值
  51.  
  52. public bool valid ( void ) //判断链表是否有效
  53. }

  测试代码:

  1. <?php
  2.  
  3. //无参数类型方法的调用
  4. function out($name)
  5. {
  6. global $doub ;
  7. if(is_array($name)){
  8. foreach($name as $value){
  9. echo "$value is:".$doub->$value().PHP_EOL;
  10. }
  11. }else{
  12. echo "$name is:".$doub->$name().PHP_EOL;
  13. }
  14. return ;
  15. }
  16. $echo = array();
  17. $doub = new SplDoublyLinkedList();
  18. $doub->push(1);
  19. $doub->push(2);//从尾节点插入值
  20. $doub->unshift(9);//从首节点插入
  21. $doub->push(4);
  22. $doub->push(5);
  23. $doub->push(6);
  24. $doub->push(7);
  25. $doub->push(8);
  26. $doub->push(11);
  27. $doub->pop();//删除尾节点
  28. $doub->shift();//删除首节点
  29. $doub->rewind(); //初始化当前指针
  30. print_r($doub);
  31. $doub->add(1,10);//在特定位置1插入值
  32. print_r($doub);
  33. $echo = ['count', 'bottom', 'top',
  34. 'getIteratorMode', 'serialize',
  35. 'current','next','next','next',
  36. 'next','current','prev','current','isEmpty'
  37. ];
  38. out($echo);
  39. $doub->offsetSet(3,'');
  40. //$doub->offsetUnset(1);
  41. print_r($doub);
  42. out(['current', 'valid']);

  

2.栈SplStack

结构:

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

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

3.队列SplQueue

结构图:

继承了双向链表所有方法

另添加了两个方法

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

  

4.堆SplHeap

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

大顶堆结构:

类定义:

  1. abstract SplHeap implements Iterator , Countable {
  2.  
  3. /* 方法 */
  4.  
  5. public __construct ( void )
  6.  
  7. abstract protected int compare ( mixed $value1 , mixed $value2 )//抽象方法,需要在自己的类里实现,通过比较决定是大顶堆还是小顶堆
  8.  
  9. public int count ( void )
  10.  
  11. public mixed current ( void )
  12.  
  13. public mixed extract ( void )
  14.  
  15. public void insert ( mixed $value )
  16.  
  17. public bool isEmpty ( void )
  18.  
  19. public mixed key ( void )
  20.  
  21. public void next ( void )
  22.  
  23. public void recoverFromCorruption ( void )
  24.  
  25. public void rewind ( void )
  26.  
  27. public mixed top ( void )
  28.  
  29. public bool valid ( void )
  30. }

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

测试代码:

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

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

  1. <?php
  2. $obj = new SplMaxHeap();
  3. $obj->insert( 4 );
  4. $obj->insert( 8 );
  5. $obj->insert( 1 );
  6. $obj->insert( 0 );
  7. echo '/*****大顶堆*****/';
  8. print_r($obj);
  9.  
  10. $obj = new SplMinHeap();
  11. $obj->insert( 4 );
  12. $obj->insert( 8 );
  13. $obj->insert( 1 );
  14. $obj->insert( 0 );
  15. echo '/*****小顶堆*****/';
  16. 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. SPC-Light显示正常的日期与时间

    SPC-Light的日期值与时间值显示正常的日期与时间.在读取到它的日期值: 得到的结果,如: 读取时间: 得到的结果如0.556678240740741. 要把它们显示正常的日期与时间格式.在VB. ...

  2. java 学习第三篇if判断

    JAVA 判断 单词: if 如果 else 否则 单分支: If(条件) { 代码块 } If是一个判断语句.代码格式如上. If括号的内是表达式.如果表达式值是成立的便执行代码块.之后在执行IF语 ...

  3. C:简单的学生信息处理程序实现

    描述 在一个学生信息处理程序中,要求实现一个代表学生的类,并且所有成员变量都应该是私有的. (注:评测系统无法自动判断变量是否私有.我们会在结束之后统一对作业进行检查,请同学们严格按照题目要求完成,否 ...

  4. H - the Sum of Cube(水题)

    A range is given, the begin and the end are both integers. You should sum the cube of all the intege ...

  5. UGUI 深度優化提升手遊效能

    https://hackmd.io/s/S1z1ByaGb#UGUI-%E6%B7%B1%E5%BA%A6%E5%84%AA%E5%8C%96%E6%8F%90%E5%8D%87%E6%89%8B%E ...

  6. 转载黑客是如何黑到你手机的?绝对涨姿势,一位黑客的Wi-Fi入侵实录!

        声明:这是一虚构的故事,因此对图片均进行了模糊化处理.内容整理自网络! 故事的主人公小黑是一名从事IT相关工作的技术宅男.五一长假来临,宅在家中的他相当无聊,打开手机上的Wi-Fi模块,发现附 ...

  7. Python之‘’控制流‘’

    一.if语句 格式: i1 = 3 if i1 > 4: print('yes you are right') elif 0 < i1 < 4: print('im dont kon ...

  8. NOIWC2019游记

    更新完了? ghj1222这个智障因为NOIP考的太菜没有去THUWC和PKUWC,但是NOIWC还是苟进去了 由于已经结束了,好多事实忘了,所以可能不完整 2019/1/23 Wednesday 明 ...

  9. 关于IBOutlet的生命周期

    在调试程序的时候,发现 IBOutlet的对象在执行 getter时,开始一直想找IBOutlet对象getter方法前被执行的代码,但是一直找不到,于是我就想是不是系统自动给IBOutlet 自动初 ...

  10. Codeforces-C-Nice Garland(枚举+暴力)

    You have a garland consisting of nn lamps. Each lamp is colored red, green or blue. The color of the ...