php spl数据结构
Posted 凉凉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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数据结构的主要内容,如果未能解决你的问题,请参考以下文章