数据结构随笔-php实现栈

栈(Stack)满足后进先出(LIFO)的原则;

下面利用php实现栈的相关操作;

本实例栈的基本操作:

入栈(push):向栈内压入一个元素,栈顶指针指向栈顶元素

出栈(pop): 从栈顶去除元素,栈顶指针向栈底移动;

判空(isEmpty):当栈顶指针恢复为初始指针状态即为空栈;

判满(isFull): 当栈顶等于容量减一则栈满;

使用php数组实现一个简单操作的栈;

<?php

/**
 * Created by PhpStorm.
 * User: gordon
 * Date: 2017/8/6
 * Time: 12:58
 */

/**
 * Class Stack 简单栈
 */
class Stack
{
    /**
     * 栈初始指针
     */
    const TOP_INIT = -1;

    /**
     * 栈底指针
     */
    const BOTTOM = 0;
    /**
     * @var array 栈数组
     */
    private $_stack;

    /**
     * @var int 栈顶指针
     */
    private $_stackTop;

    /**
     * @var int 栈的容量
     */
    private $_stackSize;

    /**
     * Stack constructor. 初始化栈
     * @param int $size 栈的容量大小;
     */
    public function __construct($size)
    {
        $this->_stack = [];
        $this->_stackSize = $size;

        /**
         * 栈顶初始状态位于栈底
         */
        $this->_stackTop = self::TOP_INIT;
    }

    /**
     * @method 销毁栈(非必需)
     */
    public function __destruct()
    {
        unset($this->_stack);
    }

    /**
     * @method 入栈
     * @param mixed $elem 入栈元素
     * @return bool
     */
    public function push($elem)
    {
        if ($this->isFull()) {
            return false;
        }
        $this->_stack[++$this->_stackTop] = $elem;
        return true;
    }

    /**
     * @method 出栈
     * @return mixed|null 返回栈顶的元素或者当栈为空时返回null
     */
    public function pop()
    {
        if ($this->isEmpty()) {
            return null;
        }
        $result = $this->_stack[$this->_stackTop];
        unset($this->_stack[$this->_stackTop]);
        $this->_stackTop--;
        return $result;
    }

    /**
     * @method 判断栈是否为空;
     * @return bool
     */
    public function isEmpty()
    {
        return $this->_stackTop === self::TOP_INIT;
    }

    /**
     * @method 判断栈是否达到最大;
     * @return bool
     */
    public function isFull()
    {
        return $this->_stackSize - 1 === $this->_stackTop;
    }

    /**
     * @method 清空栈
     */
    public function clearStack()
    {
        $this->_stack = [];
        $this->_stackTop = self::TOP_INIT;
    }

    /**
     * @method 遍历栈(测试用);
     */
    public function outputStack()
    {
        echo ‘take traversal stack from bottom to top‘.PHP_EOL;
        for ($i = self::BOTTOM; $i < $this->_stackTop + 1; $i++) {
            echo $this->_stack[$i].PHP_EOL;
        }
        echo PHP_EOL;
        echo PHP_EOL;
        echo ‘take traversal stack from top to bottom‘.PHP_EOL;
        for ($i = $this->_stackTop; $i >= self::BOTTOM; $i--) {
            echo $this->_stack[$i].PHP_EOL;
        }
    }
}

测试一下栈操作类

$s = new Stack(4);

$s->push(1);
$s->push(2);
$s->push(3);
$s->push(4);
$s->push(5);
$s->outputStack();  //stack from top to bottom: 4 3 2 1
$s->pop();          //output:4  stack: 3 2 1
$s->pop();          //output:3  stack: 2 1
$s->outputStack();  //stack: 2 1
$s->push(5);
$s->outputStack();  //stack: 5 2 1
$s->clearStack();
var_dump($s->pop());    //null;

经过测试代码很讲道理;

如有不对,敬请指教

时间: 2024-10-08 17:57:34

数据结构随笔-php实现栈的相关文章

一步一步学习数据结构(三)栈的顺序存储结构实现代码

//栈这种逻辑结构的实现与一般线性表的实现类似,有两种存储方式:顺序存储和链式存储 //先学习顺序存储 //1. #include<stdio.h> #include<stdlib.h> #define null NULL #define SIZE 100 typedef int dataType ; typedef struct { dataType data[SIZE]; int top; }cStack,*cStackPointer; //初始化栈空间 void initSt

[考研系列之数据结构]线性表之栈

?基本概念 栈的定义 限定仅在表尾进行插入或删除的线性表 组成 栈顶 栈底 基本操作 入栈(PUSH) 往栈中插入一个元素 弹栈(POP) 从栈顶删除一个元素 栈的表示 顺序栈 链栈 对于顺序栈,有两个指针base和top base指向栈底 top指向栈顶 对于栈的一些基本情况: 栈不存在时候 base=NULL 栈为空时  top=base 栈的长度 top-base 链栈略过. 栈的应用 1 数制转换 数制转换我们使用一种称之为"辗转相除法"的算法.此算法的基本原理基于: N=(N

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

13、蛤蟆的数据结构笔记之十三栈的应用之栈与递归之斐波那契数列

13.蛤蟆的数据结构笔记之十三栈的应用之栈与递归之斐波那契数列 本篇名言:"人生不是一支短短的蜡烛,而是一支由我们暂时拿着的火炬,我们一定要把它燃得." 继续递归的斐波那契数列问题. 欢迎转载,转载请标明出处: 1.  斐波那契数列 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学

11、蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现

11.蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现 本篇名言:"人生不售来回票,一旦动身,绝不能复返." 继续栈应用实现,这次是来看下表达式求值的栈实现. 欢迎转载,转载请标明出处: 1.  表达式求值 表达式求值是设计语言编译中的一个基本问题,它的实现是栈应用的又一个典型例子. 任何一个表达式都是由操作数(Operand).运算符(operator)和界限符(delimiter)组成. 操作数可以是常数也可以是变量或变量的标识符. 运算符可以分为算术运算符.关系运算符和逻辑运算符

数据结构学习笔记之栈

栈(stack)  是限定仅在表尾进行插入或删除操作的线性表.因此,对栈来说,表尾端有其特殊含义,称为栈项(top),相应地,表头端称为栈底(bottom).不含元素的空表称为空栈. 栈有两种存储表示方法:顺序栈和链栈.顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置.通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C作描述语言时,如此设定会带来很大不便:另一方面,由于栈在使用过程

9、蛤蟆的数据结构笔记之九栈的应用之行编辑实现

9.蛤蟆的数据结构笔记之九栈的应用之行编辑实现 本篇名言:"人生照例是一场值得一搏的争衡,然而它的奖品是拼斗." 继续栈结构的应用,行编辑. 欢迎转载,转载请标明出处: 1.  行编辑 行编辑的功能是接受用户从终端输入的程序或数据.每接受一个字符即存入用户数据区的做法不是最恰当的.好的做法是建立一个缓存区,允许洪湖输入出错,并在发现有无时可以及时更正.用栈来实现这个输入缓冲区是非常适合的. 每当从终端接受了一个字符后先作判别,如果不是退格符也不是退行符,则将该字符压入栈顶:如果是退格符

5、蛤蟆的数据结构笔记之五链栈实现

5.蛤蟆的数据结构笔记之五链栈实现 本篇名言:"人生就像奕棋,一步失误,全盘皆输." 昨天对栈和队列进行了定义.这次我们来看下如何使用代码来实现链栈和链队列,后续蛤蟆会记录如何将栈应用到实际问题中. 栈一般是顺序结构,但是也可以采用链式存储结构,具体如下实现. 欢迎转载,转载请标明出处: 1.  定义结构体 #define MAX_STACKS10 typedef struct { intkey; /*otherfields */ }element; typedef struct st

java数据结构与算法之栈(Stack)设计与实现

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53362993 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈设计与实现 ??本篇是jav