php单链表队列,PHP通过带尾指针的链表实现'队列'

本文介绍了如何使用PHP实现一个基于链表的队列,通过维护一个尾指针,实现了入队和出队操作的时间复杂度均为O(1)。文章展示了具体代码实现,包括enqueue(入队)、dequeue(出队)等方法,并通过示例展示了队列的使用,如元素入队、出队及打印队列内容。此外,还提供了QueueByLinkedList类的详细结构和Queue接口的定义。
摘要由CSDN通过智能技术生成

这篇文章是展示通过 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 "
";

echo $queue->dequeue(); //出队 打印 rr

echo "
";

echo $queue->dequeue(); //出队 打印 tt

echo "
";

echo $queue->dequeue(); //出队 打印 yy

echo "
";

echo $queue->toString(); //打印 uu->ii->oo->null

echo "
";

$queue->enqueue("11"); //入队

$queue->enqueue("22"); //入队

$queue->enqueue("33"); //入队

$queue->enqueue("44"); //入队

$queue->enqueue("55"); //入队

$queue->enqueue("66"); //入队

echo "
";

echo $queue->toString(); //打印 uu->ii->oo->11->22->33->44->55->66->null

3.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;

}

}

4.interface Queue

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

interface Queue

{

public function enqueue($e): void;//入队

public function dequeue();//出队

public function getFront();//获取前端元素

public function getSize();//获取队列大小

public function isEmpty();//判断队列是否为空

}

扫码关注爱因诗贤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值