栈(Stack)
一.栈的基本概念
1.栈本质上就是一种加了限制的数组,它只允许在一端进行插入或删除操作。
2.栈数据结构可以比喻为手枪弹夹。
手枪弹夹是一种用于存储子弹的装置,具有一些特殊的属性和行为,类似于栈。
①后进先出(LIFO):手枪弹夹的工作原则是后放入的子弹将首先被使用。当手枪发射子弹时,从弹夹的顶部取出最后放入的子弹,以确保最新的子弹被使用。
②只能在一端进行插入和删除操作:手枪弹夹通常只允许在顶部插入和弹出子弹。新的子弹被插入到弹夹的顶部,而弹出子弹时也是从顶部开始。
③不能在中间进行任何操作:手枪弹夹不允许在中间位置进行插入或删除子弹。只能对位于顶部的子弹进行访问或修改。
栈顶(Top):线性表允许进行插入和删除的一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素。
2.栈的基本操作
(1)push():进栈,若栈未满,则将$item加入使之成为新栈顶
(2)Pop():出栈,若栈非空,则将栈顶元素移除,并用$item返回
(3)peek():读栈顶元素,若栈顶元素非空,返回栈顶元素
(4)isEmpty():判断一个栈是否为空
二.PHP 实现
1.Stack 对象定义
class Stack {
private $stackArray;
private $top;
public function __construct() {
$this->stackArray = array();
$this->top = -1;
}
#将元素推入栈中
public function push($item) {
$this->top++;
$this->stackArray[$this->top] = $item;
}
#从栈中弹出元素
public function pop() {
if ($this->isEmpty()) {
return null;
}
$item = $this->stackArray[$this->top];
unset($this->stackArray[$this->top]);
$this->top--;
return $item;
}
#查栈是否为空
public function isEmpty() {
return ($this->top == -1);
}
#查看栈顶元素
public function peek() {
if ($this->isEmpty()) {
return null;
}
return $this->stackArray[$this->top];
}
#获取栈的大小
public function size() {
return ($this->top + 1);
}
}
2.Stack 对象使用
$stack = new Stack();
$stack->push(11);
$stack->push(22);
$stack->push(33);
echo $stack->pop(); // 输出: 33
echo $stack->peek(); // 输出: 22
echo $stack->size(); // 输出: 2
echo $stack->isEmpty() ? '栈为空' : '栈不为空'; // 输出: 栈不为空