首页 > 代码库 > 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数据结构
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。