码迷,mamicode.com
首页 > Web开发 > 详细

php spl数据结构

时间:2017-03-13 00:08:42      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:cte   构造   logs   yacc   recover   exists   ext   函数   exist   

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数据结构

标签:cte   构造   logs   yacc   recover   exists   ext   函数   exist   

原文地址:http://www.cnblogs.com/scarecrowlxb/p/6539606.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!