PHP如何通過帶尾指針的鏈表實(shí)現(xiàn)'隊列'
這篇文章是展示通過 PHP 語言實(shí)現(xiàn)一種帶 尾指針 的鏈表,然后通過鏈表來實(shí)現(xiàn)隊列,其中鏈表的頭元素 head 是用于列隊 出隊 的,它的時間復(fù)雜度 O(1) ,若在 head 的基礎(chǔ)上實(shí)現(xiàn)鏈表尾部 入隊 時間度為 O(n),為了降低入隊操作的時間復(fù)雜度,可以給鏈表維護(hù)一個帶有尾指針的變量 tail ,這樣每次入隊的時候直接操作 tail ,出隊的時候直接操作 head ,這樣可以使得 入隊 和 出隊 時間復(fù)雜度都是 O(1)。
1.output_queue_by_liked_list.php
這是一個演示打印輸出結(jié)果的文件:
<?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 類
這是通過帶尾指針鏈表實(shí)現(xiàn)的 隊列 類,它里面有 入隊(enqueue) 方法和 出隊(dequque) 方法 :
<?php
require 'Queue.php';
/**
* 帶有尾指針的鏈表
* Class LinkedListTail
*/
class QueueByLinkedList implements Queue
{
private $head; //鏈表頭部
private $tail; //鏈表尾部
private $size; //鏈表大小
/**
* 構(gòu)造函數(shù) 初始化鏈表
* 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 "隊列已經(jīng)是空的";
}
$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 "隊列已經(jīng)是空的";
}
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;//節(jié)點(diǎn)元素
public $next; //下個節(jié)點(diǎn)信息
/**
* 構(gòu)造函數(shù) 設(shè)置節(jié)點(diǎn)信息
* Node constructor.
* @param $e
* @param $next
*/
public function __construct($e, $next) {
$this->e = $e;
$this->next = $next;
}
}
3.interface Queue
這里是 隊列 類一個實(shí)現(xiàn)接口,里面定義了一些函數(shù),繼承它之后,必須重構(gòu)里面的所有方法:
<?php
interface Queue
{
public function enqueue($e): void;//入隊
public function dequeue();//出隊
public function getFront();//獲取前端元素
public function getSize();//獲取隊列大小
public function isEmpty();//判斷隊列是否為空
}
以上就是PHP如何通過帶尾指針的鏈表實(shí)現(xiàn)'隊列'的詳細(xì)內(nèi)容,更多關(guān)于PHP 實(shí)現(xiàn)隊列的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP多線程批量采集下載美女圖片的實(shí)現(xiàn)代碼(續(xù))
之前寫過一篇《PHP批量采集下載美女圖片》文中主要采用file_get_content做采集圖片,今天發(fā)現(xiàn)采集了400張圖片 居然需要70分鐘以上,真是難以忍受2013-06-06
Laravel框架控制器的middleware中間件用法分析
這篇文章主要介紹了Laravel框架控制器的middleware中間件用法,結(jié)合具體案例形式分析了Laravel框架控制器的middleware中間件相關(guān)使用步驟、操作技巧與注意事項,需要的朋友可以參考下2019-09-09

