zoukankan      html  css  js  c++  java
  • 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);
    

      

    除此之外还有优先队列,定长数组,对象存储等结构

  • 相关阅读:
    力扣算法题—048旋转图像
    力扣算法题—047全排列2
    力扣算法题—046全排列
    力扣算法题—045跳跃游戏二
    数据结构【排序】—排序算法大集合
    数据结构【查找】—B树
    第一百四十四天 how can I 坚持
    第一百四十一/二/三天 how can I 坚持
    第一百四十天 how can I坚持
    第一百三十九天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/scarecrowlxb/p/6539606.html
Copyright © 2011-2022 走看看