前幾天更新了一篇《php實現基本資料結構之連結串列》居然還有人看,今天來更新一篇棧與佇列的文章。
棧與佇列也是連結串列結構的一種,只不過有些特殊。
棧是一種LIFO(last in first out後進先出)結構, 佇列是一種FIFO(first in first out先進先出)結構, 給出兩張圖體會一下區別。
-
棧模型
-
佇列模型
看到網上的一些帖子用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;
}
}
複製程式碼
以上簡寫了大致實現棧、佇列的鏈式結構
不得不提的是 革命尚未成功碼農仍需努力