1、隊列
1)隊列(Queue)是一種先進先出(FIFO)的線性表,它只容許在表的前端進行刪除操做,在表的後端進行插入操做,進行插入操做的端稱爲隊尾,進行刪除操做的端稱爲隊頭。即入隊只能從隊尾入,出隊只能從隊頭出。
2)隊列通常擁有隊首(front指針)和隊尾(rear指針),當一個隊列並未存入數據的時候,front和rear指針均指向隊首。
3)入隊操做:rear後移,存入數據在rear指向的單元,隊滿不可入隊,這同時也代表front老是指向隊首元素的前驅。
4)出隊操做:front後移,元素出隊,隊空不可出隊。
5)在PHP函數中,array_push函數是向數組尾部添加元素,即入隊操做;array_shift函數是刪除數組頭部元素,即出隊操做。
$array = array('a', 'b');
array_push($array, 'c'); //入隊
array_shift($array); //出隊
隊列的數組實現
<?php /** * php用數組實現隊列:先進先出FIFO 1. getLength(): 得到隊列的長度 2. isEmpty(): 判斷隊列是否爲空 3. enqueue(): 入隊,在隊尾加入數據。 4. dequeue(): 出隊,返回並移除隊首數據。隊空不可出隊。 5. show(): 遍歷隊列,並輸出 6. clear(): 清空隊列 */ class Queue { // 隊列數組 public $dataStore = array(); // 得到隊列的長度 public function getLength() { return count($this->dataStore); } // 判斷隊列是否爲空 public function isEmpty() { return $this->getLength() === 0; } // 入隊,在隊尾加入數據。 public function enqueue($element) { $this->dataStore[] = $element; // array_push($this->dataStore, $element); } // 出隊,返回並移除隊首數據。隊空不可出隊。 public function dequeue() { if (!$this->isEmpty()) { return array_shift($this->dataStore); } return false; } // 遍歷隊列,並輸出 public function show() { if (!$this->isEmpty()) { for ($i = 0; $i < $this->getLength(); $i++) { echo $this->dataStore[$i] . PHP_EOL; } } else { return "空"; } } // 清空隊列 public function clearQueue() { unset($this->dataStore); // $this->dataStore = array(); } } // 測試 $q = new Queue(); $q->enqueue('a'); $q->enqueue('b'); $q->enqueue('c'); echo '隊列的長度爲:' . $q->getLength(); echo "</br>"; echo '隊列爲:'; $q->show(); echo "</br>"; $q->dequeue(); echo "</br>"; echo "a出隊,隊列爲:"; $q->show(); $q->clearQueue(); echo "清空隊列後,隊列爲" . $q->show(); 複製代碼
隊列的鏈表實現php
建立鏈式隊列時,需定義兩個結構,一個用於描述節點,一個用於描述隊列。
<?php /** * php用鏈表實現隊列:先進先出FIFO 1. isEmpty(): 判斷隊列是否爲空 2. enqueue(): 入隊,在隊尾加入數據。 3. dequeue(): 出隊,返回並移除隊首數據。隊空不可出隊。 4. clear(): 清空隊列 5. show(): 顯示隊列中的元素 */ // 節點類 class Node { public $data; // 節點數據 public $next; // 下一節點 public function __construct($data) { $this->data = $data; $this->next = NULL; } } // 隊列類 class Queue { private $header; // 頭節點 function __construct($data) { $this->header = new Node($data); } // 判斷隊列是否爲空 public function isEmpty() { if ($this->header->next !== null) { // 不爲空 return false; } return true; } // 入隊,在隊尾加入數據。 public function enqueue($element) { $newNode = new Node($element); $current = $this->header; if ($current->next == null) { // 只有頭節點 $this->header->next = $newNode; } else { // 遍歷到隊尾最後一個元素 while ($current->next != null) { $current = $current->next; } $current->next = $newNode; } $newNode->next = null; } // 出隊,返回並移除隊首數據。隊空不可出隊。 public function dequeue() { if ($this->isEmpty()) { // 隊列爲空 return false; } // header頭節點沒有實際意義,隊首節點是header指向的結點。 $current = $this->header; $current->next = $current->next->next; } // 清空隊列 public function clear() { $this->header = null; } // 顯示隊列中的元素 public function show() { $current = $this->header; if ($this->isEmpty()) { echo "空!"; } while ($current->next != null) { echo $current->next->data . PHP_EOL; $current = $current->next; } } } // 測試 $q = new Queue('header'); $q->enqueue('a'); $q->enqueue('b'); $q->enqueue('c'); echo "隊列爲:"; $q->show(); echo "</br>"; echo "a出隊,隊列爲:"; $q->dequeue(); $q->show(); echo "</br>"; $q->clear(); echo "清空隊列後,隊列爲"; $q->show(); 複製代碼
2、棧
1)棧(Stack)是一種後進先出(LIFO)表,插入刪除操做都只能在一個位置上進表,這個位置位於表的末端,叫作棧頂(Top),另外一端則稱爲棧底(Bottom),又稱爲表頭。
2)對棧的基本操做有push和pop,表示進棧和出棧,至關於插入和刪除操做。存儲數據時,先進入的數據被壓入棧底,後進入的數據則在棧頂;讀取數據時,從棧頂開始彈出數據。
3)在PHP函數中,array_push函數是向數組尾部添加元素,即入棧操做;array_pop函數是刪除數組尾部元素,即出棧操做。
$array = array('a', 'b');
array_push($array, 'c'); //入棧
array_pop($array); //出棧
棧的數組實現
選擇用數組表示棧內容必須預先估計棧的最大容量。由於數組一旦建立,其大小是沒法改變的,而數組設置過大可能會浪費大量內存,設置太小又可能會溢出。
<?php /** * php用數組實現棧:後入先出LIFO 1. getLength(): 得到棧的長度 2. push(): 入棧,在最頂層加入數據。 3. pop(): 出棧,返回並移除最頂層的數據。 4. getTop(): 返回最頂層數據的值,但不移除它 5. clearStack(): 清空棧 6. show(): 遍歷棧元素 */ class Stack { // 使用數組實現棧結構 public $stack = array(); // 得到棧的長度 public function getLength() { return count($this->stack); } // 入棧,在最頂層加入數據。 public function push($element) { $this->stack[] = $element; } // 出棧,返回並移除最頂層的數據。 public function pop() { if ($this->getLength() > 0) { return array_pop($this->stack); } } // 返回最頂層數據的值,但不移除它 public function getTop() { $top = $this->getLength() - 1; return $this->stack[$top]; } // 清空棧 public function clearStack() { unset($this->stack); // $this->stack = array(); } // 遍歷棧元素 public function show() { if ($this->getLength() > 0) { for ($i = 0; $i < $this->getLength(); $i++) { echo $this->stack[$i] . PHP_EOL; } } echo "空!"; } } // 測試 $s = new Stack(); $s->push('a'); $s->push('b'); $s->push('c'); echo "棧爲:"; $s->show(); echo "</br>"; echo '棧頂元素爲' . $s->getTop(); echo "</br>"; echo '棧的長度爲:' . $s->getLength(); echo "</br>"; $s->pop(); echo "出棧,彈出c,棧爲:"; $s->show(); echo "</br>"; echo "清空棧,棧爲:"; $s->clearStack(); $s->show();
棧的鏈表實現html
<?php /** * php用數組實現棧:後入先出LIFO 1. isEmpty(): 判斷隊列是否爲空。 2. push(): 入棧,插入新的棧頂節點 3. pop(): 出棧,刪除棧頂元素 4. clear(): 清空棧 5. show(): 遍歷棧元素 */ // 節點類 class Node { public $data; // 節點數據 public $next; // 下一節點 public function __construct($data) { $this->data = $data; $this->next = NULL; } } class Stack { private $header; // 頭節點 function __construct($data) { $this->header = new Node($data); } // 判斷棧是否爲空 public function isEmpty() { if ($this->header->next !== null) { // 不爲空 return false; } return true; } // 入棧,插入新的棧頂節點 public function push($element) { $newNode = new Node($element); $current = $this->header; if ($current->next == null) { // 只有頭節點 $this->header->next = $newNode; } else { // 遍歷到棧尾最後一個元素 while ($current->next != null) { $current = $current->next; } $current->next = $newNode; } $newNode->next = null; } // 出棧,刪除棧頂元素 public function pop() { if ($this->isEmpty()) { // 棧爲空 return false; } $current = $this->header; while ($current->next->next != null) { $current = $current->next; } $current->next = null; } // 清空棧 public function clear() { $this->header = null; } // 顯示棧中的元素 public function show() { $current = $this->header; if ($this->isEmpty()) { echo "空!"; } while ($current->next != null) { echo $current->next->data . PHP_EOL; $current = $current->next; } } } // 測試 $s = new Stack('header'); $s->push('a'); $s->push('b'); $s->push('c'); echo "棧爲:"; $s->show(); echo "</br>"; $s->pop(); echo "出棧,彈出c,棧爲:"; $s->show(); echo "</br>"; echo "清空棧,棧爲:"; $s->clear(); $s->show();
原文:https://www.cnblogs.com/sunshineliulu/p/7740102.html前端