栈(Stack),是一种特殊的后进先出线性表,其只能在一端进行插入(插入一般称为压栈、进栈或入栈)和删除(删除一般称为弹栈、退栈或出栈)操作,允许进行插入和删除操作的一端称为栈顶,另一端则称为栈底。栈,按照后进先出的原则存储数据,先进入的数据被压入栈底,后进入的数据则在栈顶,需要读取数据的时候,从栈顶开始弹出数据。当栈中没有元素时,称为空栈。



数据结构与算法(PHP实现) - 栈(Stack)


1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50


51


52


53


54


55


56


57


58


59


60


61


62


63


64


65


66


67


68


69


70


71


72


73


74


75


76


77


78


79


80


81


82


83


84


85


86


87


88


89


90


91


92


93


94


95


96


97


98


99


100




​<?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


2


3


4


5


6


7


8




​<?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(弹栈)。


​​