PHP如何通过带尾指针的链表实现'队列'

吾爱主题 阅读:146 2021-10-27 14:51:00 评论:0

这篇文章是展示通过 PHP 语言实现一种带 尾指针 的链表,然后通过链表来实现队列,其中链表的头元素 head 是用于列队 出队 的,它的时间复杂度 O(1) ,若在 head 的基础上实现链表尾部 入队 时间度为 O(n),为了降低入队操作的时间复杂度,可以给链表维护一个带有尾指针的变量 tail ,这样每次入队的时候直接操作 tail ,出队的时候直接操作 head ,这样可以使得 入队 出队 时间复杂度都是 O(1)。

1.output_queue_by_liked_list.php

这是一个演示打印输出结果的文件:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php require 'QueueByLinkedList.php' ; $queue = new QueueByLinkedList(); $queue ->enqueue( "rr" ); //入队 $queue ->enqueue( "tt" ); //入队 $queue ->enqueue( "yy" ); //入队 $queue ->enqueue( "uu" ); //入队 $queue ->enqueue( "ii" ); //入队 $queue ->enqueue( "oo" ); //入队 echo $queue ->toString(); //打印 rr->tt->yy->uu->ii->oo->null echo "<br>" ; echo $queue ->dequeue(); //出队 打印 rr echo "<br>" ; echo $queue ->dequeue(); //出队 打印 tt echo "<br>" ; echo $queue ->dequeue(); //出队 打印 yy echo "<br>" ; echo $queue ->toString(); //打印 uu->ii->oo->null echo "<br>" ; $queue ->enqueue( "11" ); //入队 $queue ->enqueue( "22" ); //入队 $queue ->enqueue( "33" ); //入队 $queue ->enqueue( "44" ); //入队 $queue ->enqueue( "55" ); //入队 $queue ->enqueue( "66" ); //入队 echo "<br>" ; echo $queue ->toString(); //打印 uu->ii->oo->11->22->33->44->55->66->null

2.QueueByLinkedList 类

这是通过带尾指针链表实现的 队列 类,它里面有  入队(enqueue) 方法和  出队(dequque) 方法 :

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 <?php require 'Queue.php' ; /**   * 带有尾指针的链表   * Class LinkedListTail   */ class QueueByLinkedList implements Queue {    private $head ; //链表头部    private $tail ; //链表尾部    private $size ; //链表大小    /**     * 构造函数 初始化链表     * QueueByLinkedList constructor.     */    public function __construct() {      $this ->head = null;      $this ->tail = null;      $this ->size = 0;    }    /**     * 入队操作     * @param $e     */    public function enqueue( $e ): void {      if ( $this ->tail == null) {        $this ->tail = $this ->head = new Node( $e , null);      } else {        $node = new Node( $e , null);        $this ->tail->next = $node ;        $this ->tail = $node ;      }      $this ->size++;    }    /**     * 出队操作     * @return mixed     */    public function dequeue() {      if ( $this ->size == 0) {        return "队列已经是空的" ;      }      $node = $this ->head;      $this ->head = $node ->next;      $this ->size--;      if ( $node ->next == null) {        $this ->tail = null;      }      return $node ->e;    }    public function getFront() {      if ( $this ->size == 0) {        return "队列已经是空的" ;      }      return $this ->head->e;    }    public function getSize() {      return $this ->size;    }    /**     * 判断队列是否为空     * @return bool     */    public function isEmpty(): bool {      return $this ->size == 0;    }    public function toString() {      $str = "" ;      for ( $node = $this ->head; $node != null; $node = $node ->next) {        $str .= $node ->e . "->" ;      }      $str .= "null" ;      return $str ;    } } class Node {    public $e ; //节点元素    public $next ; //下个节点信息    /**     * 构造函数 设置节点信息     * Node constructor.     * @param $e     * @param $next     */    public function __construct( $e , $next ) {      $this ->e = $e ;      $this ->next = $next ;    } }

3.interface Queue

这里是 队列 类一个实现接口,里面定义了一些函数,继承它之后,必须重构里面的所有方法:

?
1 2 3 4 5 6 7 8 9 <?php interface Queue {    public function enqueue( $e ): void; //入队    public function dequeue(); //出队    public function getFront(); //获取前端元素    public function getSize(); //获取队列大小    public function isEmpty(); //判断队列是否为空 }

以上就是PHP如何通过带尾指针的链表实现'队列'的详细内容,更多关于PHP 实现队列的资料请关注服务器之家其它相关文章!

原文链接:https://segmentfault.com/a/1190000037557689?utm_source=tuicool&utm_medium=referral

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容