首页 > 代码库 > php spl数据结构

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后堆变空(堆内没有数据)

测试代码:

<?phpclass 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;  //8echo ‘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数据结构