标签: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);
除此之外还有优先队列,定长数组,对象存储等结构
标签:cte 构造 logs yacc recover exists ext 函数 exist
原文地址:http://www.cnblogs.com/scarecrowlxb/p/6539606.html