这篇文章是展示通过 PHP 语言实现一种带 尾指针 的链表,然后通过链表来实现队列,其中链表的头元素 head 是用于列队 出队 的,它的时间复杂度 O(1) ,若在 head 的基础上实现链表尾部 入队 时间度为 O(n),为了降低入队操作的时间复杂度,可以给链表维护一个带有尾指针的变量 tail ,这样每次入队的时候直接操作 tail ,出队的时候直接操作 head ,这样可以使得 入队 和 出队 时间复杂度都是 O(1)。
1.output_queue_by_liked_list.php
这是一个演示打印输出结果的文件:
<?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) 方法 :
<?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
这里是 队列 类一个实现接口,里面定义了一些函数,继承它之后,必须重构里面的所有方法:
<?php interface Queue { public function enqueue($e): void;//入队 public function dequeue();//出队 public function getFront();//获取前端元素 public function getSize();//获取队列大小 public function isEmpty();//判断队列是否为空 }
以上就是PHP如何通过带尾指针的链表实现'队列'的详细内容,更多关于PHP 实现队列的资料请关注小牛知识库其它相关文章!
本文向大家介绍C#通过链表实现队列的方法,包括了C#通过链表实现队列的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#通过链表实现队列的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。
题目描述 输入一个整数序列:a1, a2, a3,…,an,进行入队或出队操作。用带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意:不设头指针),试编写相应的置空队、判队空、入队和出队等算法,并实现以下任务:对输入的ai,当ai>0时,将ai入队;当ai=0时,队头元素出队,若出队时队空则发生下溢“UNDERFLOW”,一旦发生下溢,则停止处理。 输入格式: 测试数据有多组,处理
我得到了这些结构声明,以便实现使用循环链表的队列集合。 我试图创建一个函数,它将以指定的值排队(将其追加到队列的后面),我需要考虑队列为空和队列有一个或多个元素的两种情况。这是我到目前为止的代码: 这段代码给了我一个运行时错误,所以我不确定出了什么问题。在代码中,我假设队列-
本文向大家介绍C++ 通过指针实现多态实例详解,包括了C++ 通过指针实现多态实例详解的使用技巧和注意事项,需要的朋友参考一下 C++ 通过指针实现多态实例详解 1.父类(DBConnector) 1)DBConnector.h 2)DBConnector.cpp 2.子类1(MySqlConnector) 1)MSSqlConnector.h 2)MSSqlConnector.cpp 3.子类
作为Rust的一个学习项目,我有一个非常简单的单链表实现(如果不完整,也可以使用)。结构的声明如下所示: 实施和都是相当直接的,尽管反复实施size确实涉及到一些“与借阅检查人的斗争” 我想尝试的下一件事是向LinkedList结构添加一个尾部指针。以启用有效的push_back操作。在这里,我碰到了一堵墙。起初我试图使用
我有一个链表类,这样实现(也进行了测试): 然后,我创建了一个队列类: 但是我不能在main上使用它,任何入队的尝试都会导致for循环崩溃,返回错误代码-1073741819。函数工作并显示。 输出: 我尝试为队列类编写一个构造函数来初始化LList类,但找不到正确的方法。如果我编写一个main函数只测试LList类,我就不需要初始化了,因为它的构造器已经在继续这个工作了。
下面是复制链接列表的工作函数,只需将原始链接列表的地址传递给此函数,它将创建一个副本并返回头部。 我不明白记忆是如何分配给尾巴的- 有人能帮我理解这段代码的流程吗。
我正在用C语言创建一个单链表,它有头部和尾部指针,其中头部指针指向SLL的起始节点,尾部指针指向SLL的最后一个节点。我不想使用head指针遍历到列表末尾来删除节点。有没有办法让我可以使用尾指针删除SLL的最后一个元素? 下面是节点添加函数。头部和尾部初始化为NULL。 要删除第一个节点,使用以下函数: