各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案

Str Tom,为分享PHP技术和解决方案,贡献一份自己的力量!
QQ:420220301 微信/手机:150-3210-7690
当前位置:首页 > CMS教程 > PHP

php没有链表类型么

管理员 2023-09-05
PHP
134

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没有链表类型么所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

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


希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 lecms, classcms, fastadmin, pbootcms, phpcms, eyoucms, yzmcms, PHP, xunruicms, jizhicms, dedecms, wordpress, hkcms, yzncms, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部