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数据结构的主要内容,如果未能解决你的问题,请参考以下文章

PHP的SPL扩展库数据结构

PHP、SPL、ArrayAccess 接口

在PHP中使用SPL库中的对象方法进行XML与数组的转换

在PHP中使用SPL库中的对象方法进行XML与数组的转换

在PHP中使用SPL库中的对象方法进行XML与数组的转换

PHP--SPL扩展学习笔记