棧(Stack),是一種特殊的後進先出線性表,其只能在一端進行插入(插入一般稱為壓棧、進棧或入棧)和刪除(刪除一般稱為彈棧、退棧或出棧)操作,允許進行插入和刪除操作的一端稱為棧頂,另一端則稱為棧底。棧,按照後進先出的原則存儲數據,先進入的數據被壓入棧底,後進入的數據則在棧頂,需要讀取數據的時候,從棧頂開始彈出數據。當棧中沒有元素時,稱為空棧。
數據結構與算法(PHP實現) - 棧(Stack) 1
<?php
/**
* 數據結構與算法(PHP實現) - 棧(Stack)。
*
* @author 創想編程(TOPPHP.ORG)
* @copyright Copyright (c) 2013 創想編程(TOPPHP.ORG) All Rights Reserved
* @license http://www.opensource.org/licenses/mit-license.php MIT LICENSE
* @version 1.0.0 - Build20130607
*/
class Stack {
/**
* 棧。
*
* @var array
*/
private $stack;
/**
* 棧的長度。
*
* @var integer
*/
private $size;
/**
* 構造方法 - 初始化數據。
*/
public function __construct() {
$this->stack = array();
$this->size = 0;
}
/**
* 壓棧(進棧、入棧)操作。
*
* @param mixed $data 壓棧數據。
* @return object 返回對象本身。
*/
public function push($data) {
$this->stack[$this->size++] = $data;
return $this;
}
/**
* 彈棧(退棧、出棧)操作。
*
* @return mixed 空棧時返回FALSE,否則返回棧頂元素。
*/
public function pop() {
if (!$this->isEmpty()) {
$top = array_splice($this->stack, --$this->size, 1);
return $top[0];
}
return FALSE;
}
/**
* 獲取棧。
*
* @return array 返回棧。
*/
public function getStack() {
return $this->stack;
}
/**
* 獲取棧頂元素。
*
* @return mixed 空棧時返回FALSE,否則返回棧頂元素。
*/
public function getTop() {
if (!$this->isEmpty()) {
return $this->stack[$this->size - 1];
}
return FALSE;
}
/**
* 獲取棧的長度。
*
* @return integer 返回棧的長度。
*/
public function getSize() {
return $this->size;
}
/**
* 檢測棧是否為空。
*
* @return boolean 空棧則返回TRUE,否則返回FALSE。
*/
public function isEmpty() {
return 0 === $this->size;
}
}
?>
示例代碼 1
<?php
$stack = new Stack();
$stack->push(1)->push(2)->push(3)->push(4)->push(5)->push(6);
echo '<pre>', print_r($stack->getStack(), TRUE), '</pre>';
$stack->pop();
echo '<pre>', print_r($stack->getStack(), TRUE), '</pre>';
?>
說明:PHP數組函數已有類似棧的功能函數存在:array_push(壓棧)和、array_pop(彈棧)。