当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-03-28 18:39:13 浏览: 评论:0 

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

1.output_queue_by_liked_list.php

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

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

2.QueueByLinkedList 类

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

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

3.interface Queue

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

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

Tags: PHP带尾指针 PHP队列

分享到: