php實現基本資料結構之棧、佇列

Ginger_CJ發表於2018-05-10

前幾天更新了一篇《php實現基本資料結構之連結串列》居然還有人看,今天來更新一篇棧與佇列的文章。

棧與佇列也是連結串列結構的一種,只不過有些特殊。

棧是一種LIFO(last in first out後進先出)結構, 佇列是一種FIFO(first in first out先進先出)結構, 給出兩張圖體會一下區別。

  • 棧模型

    php實現基本資料結構之棧、佇列

  • 佇列模型

    php實現基本資料結構之棧、佇列
    看到網上的一些帖子用PHP內建函式來實現棧、佇列順序儲存結構

array_push()//將一個或多個單元壓入陣列的末尾(入棧)  
array_unshift()//在陣列開頭插入一個或多個單元  
array_pop()//將陣列最後一個單元彈出(出棧)  
array_shift()//將陣列開頭的單元移出陣列 
複製程式碼

根據自己的理解給出鏈式儲存棧、佇列結構(如果理解的不準確請見諒)

還是先給出Node節點

class Node
{
    private $Data;//節點資料
    private $Next;//儲存下個點物件

    public function __construct($data, $next)
    {
        $this->Data = $data;
        $this->Next = $next;
    }

    public function __set($name, $value)
    {
        if (isset($this->$name))
            $this->$name = $value;
    }

    public function __get($name)
    {
        if (isset($this->$name))
            return $this->$name;
        else
            return NULL;
    }
}
複製程式碼

php實現棧結構(粗略實現)

class Stack
{
    private $top = NULL;//頭節點

    /**
     * 棧是否為空
     * @return bool
     */
    public function isEmpty()
    {
        if ($this->top === NULL)
            return TRUE;
        return FALSE;
    }

    /**
     * 入棧
     * @param $data
     */
    public function push($data)
    {
        $this->top = new Node($data, $this->isEmpty() ? NULL : $this->top);
    }

    /**
     * 出棧 返回出棧的Data
     * @return null | data
     */
    public function pop()
    {
        if ($this->isEmpty())
            return NULL;
        $node = $this->top->Next;
        $data = $this->top->Data;
        $this->top = $node;
        return $data;
    }
}
複製程式碼

php實現佇列結構(粗略實現)

class Queue
{
    private $front = NULL;//隊頭
    private $rear = NULL;//隊尾

    public function isEmpty()
    {
        if ($this->front === NULL || $this->rear === NULL)
            return TRUE;
        return FALSE;
    }

    /**
     * 入隊
     * @param $data
     */
    public function enQueue($data)
    {
        if ($this->isEmpty())
            $this->front = $this->rear = new Node($data, NULL);
        $this->rear->Next = new Node($data, NULL);
    }

    /**
     * 出隊
     * @return null
     */
    public function deQueue()
    {
        if ($this->isEmpty())
            return NULL;
        $node = $this->front->Next;
        $data = $this->front->Data;
        if ($this->front == $this->rear)//當隊頭跟隊尾相同時
            $this->rear = $node;
        $this->front = $node;
        return $data;
    }

}
複製程式碼

以上簡寫了大致實現棧、佇列的鏈式結構

不得不提的是 革命尚未成功碼農仍需努力

相關文章