php没有链表类型么

php没有链表类型么

内容导读

收集整理的这篇技术教程文章主要介绍了php没有链表类型么,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5780字,纯文字阅读大概需要9分钟

内容图文

PHP SPL标准库里实现了几种简单的线性表和树型结构,其中包括了双链表和双链表实现的队列和栈、最大堆、最小堆和优先队列。双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址。

双链表对php开发程序来讲是很重要的一种数据结构,可以把PHP数组中想想成一个双链表,而PHP内置的SplDoublyLinkedList类通过实现迭代器、数组访问和获取数量的接口使程序访问对象变得访问数组一样方便。(推荐学习:PHP编程从入门到精通)

SplDoublyLinkedList类代码如下:

<?php
/**
* PS:预定义接口Iterator, ArrayAccess, Countable
*/
class SplDoublyLinkedList implements Iterator, ArrayAccess, Countable
{


/**


 * @var _llist 定义一个数组用于存放数据


*/


protected $_llist
 = array();



/**


 * @var _it_mode 链表的迭代模式


*/


protected $_it_mode = 0;



/**


 * @var _it_pos 链表指针


*/


protected $_it_pos
= 0;


/**


 * 迭代模式


* @see setIteratorMode


*/


const IT_MODE_LIFO

 = 0x00000002;


const IT_MODE_FIFO

 = 0x00000000;


const IT_MODE_KEEP

 = 0x00000000;


const IT_MODE_DELETE
 = 0x00000001;



/**


 * @return 返回被移出尾部节点元素


* @throw RuntimeException 如果链表为空则抛出异常


*/


public function pop()


{




if (count($this->_llist) == 0) {






throw new RuntimeException("Can't pop from an empty datastructure");




}




return array_pop($this->_llist);


}



/**


 * @return 返回被移出头部节点元素


* @throw RuntimeException 如果链表为空则抛出异常


*/


public function shift()


{




if (count($this->_llist) == 0) {






throw new RuntimeException("Can't shift from an empty datastructure");




}




return array_shift($this->_llist);


}



/**


 * 往链表尾部添加一个节点元素


* @param $data 要添加的节点元素


*/


public function push($data)


{




array_push($this->_llist, $data);




return true;


}



/**


 * 往链表头部添加一个节点元素


* @param $data 要添加的节点元素


*/


public function unshift($data)


{




array_unshift($this->_llist, $data);




return true;


}



/**


 * @return 返回尾部节点元素,并把指针指向尾部节点元素


*/


public function top()


{




return end($this->_llist);


}



/**


 * @return 返回头部节点元素,并把指针指向头部节点元素


*/


public function bottom()


{




return reset($this->_llist);


}



/**


 * @return 返回链表节点数


*/


public function count()


{




return count($this->_llist);


}



/**


 * @return 判断链表是否为空


*/


public function isEmpty()


{




return ($this->count() == 0);


}


/**


 * 设置迭代模式


* - 迭代的顺序 (先进先出、后进先出)


*
- SplDoublyLnkedList::IT_MODE_LIFO (堆栈)


*
- SplDoublyLnkedList::IT_MODE_FIFO (队列)


*


* - 迭代过程中迭代器的行为


*
- SplDoublyLnkedList::IT_MODE_DELETE (删除已迭代的节点元素)


*
- SplDoublyLnkedList::IT_MODE_KEEP
 (保留已迭代的节点元素)


*


* 默认的模式是 0 : SplDoublyLnkedList::IT_MODE_FIFO | SplDoublyLnkedList::IT_MODE_KEEP


*


* @param $mode 新的迭代模式


*/


public function setIteratorMode($mode)


{




$this->_it_mode = $mode;


}



/**


 * @return 返回当前的迭代模式


* @see setIteratorMode


*/


public function getIteratorMode()


{




return $this->_it_mode;


}



/**


 * 重置节点指针


*/


public function rewind()


{




if ($this->_it_mode & self::IT_MODE_LIFO) {






$this->_it_pos = count($this->_llist)-1;




} else {






$this->_it_pos = 0;




}


}



/**


 * @return 判断指针对应的节点元素是否存在


*/


public function valid()


{




return array_key_exists($this->_it_pos, $this->_llist);


}



/**


 * @return 返回当前指针的偏移位置


*/


public function key()


{




return $this->_it_pos;


}



/**


 * @return 返回当前指针对应的节点元素


*/


public function current()


{




return $this->_llist[$this->_it_pos];


}



/**


 * 将指针向前移动一个偏移位置


*/


public function next()


{




if ($this->_it_mode & self::IT_MODE_LIFO) {






if ($this->_it_mode & self::IT_MODE_DELETE) {








$this->pop();






}






$this->_it_pos--;




} else {






if ($this->_it_mode & self::IT_MODE_DELETE) {








$this->shift();






} else {








$this->_it_pos++;






}




}


}


/**


 * @return 偏移位置是否存在


*


* @param $offset





 偏移位置


* @throw OutOfRangeException 如果偏移位置超出范围或者无效则抛出异常


*/


public function offsetExists($offset)


{




if (!is_numeric($offset)) {






throw new OutOfRangeException("Offset invalid or out of range");




} else {






return array_key_exists($offset, $this->_llist);




}


}



/**


 * @return 获取偏移位置对应的值


*


* @param $offset





 偏移位置


* @throw OutOfRangeException 如果偏移位置超出范围或者无效则抛出异常


*/


public function offsetGet($offset)


{




if ($this->_it_mode & self::IT_MODE_LIFO) {






$realOffset = count($this->_llist)-$offset;




} else {






$realOffset = $offset;




}




if (!is_numeric($offset) || !array_key_exists($realOffset, $this->_llist)) {






throw new OutOfRangeException("Offset invalid or out of range");




} else {






return $this->_llist[$realOffset];




}


}



/**


 * @return 设置偏移位置对应的值


*


* @param $offset





 偏移位置


* @throw OutOfRangeException 如果偏移位置超出范围或者无效则抛出异常


*/


public function offsetSet($offset, $value)


{




if ($offset === null) {






return $this->push($value);




}




if ($this->_it_mode & self::IT_MODE_LIFO) {






$realOffset = count($this->_llist)-$offset;




} else {






$realOffset = $offset;




}




if (!is_numeric($offset) || !array_key_exists($realOffset, $this->_llist)) {






throw new OutOfRangeException("Offset invalid or out of range");




} else {






$this->_llist[$realOffset] = $value;




}


}



/**


 * @return 删除偏移位置对应的值


*


* @param $offset





 偏移位置


* @throw OutOfRangeException 如果偏移位置超出范围或者无效则抛出异常


*/


public function offsetUnset($offset)


{




if ($this->_it_mode & self::IT_MODE_LIFO) {






$realOffset = count($this->_llist)-$offset;




} else {






$realOffset = $offset;




}




if (!is_numeric($offset) || !array_key_exists($realOffset, $this->_llist)) {






throw new OutOfRangeException("Offset invalid or out of range");




} else {






array_splice($this->_llist, $realOffset, 1);




}


}
}
?>

以上就是php没有链表类型么的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的php没有链表类型么全部内容,希望文章能够帮你解决php没有链表类型么所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。



联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com