1. 程式人生 > 程式設計 >PHP如何通過帶尾指標的連結串列實現'佇列'

PHP如何通過帶尾指標的連結串列實現'佇列'

這篇文章是展示通過 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 實現佇列的資料請關注我們其它相關文章!