栈(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;

经过测试代码很讲道理;

如有不对,敬请指教

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

  1. php数据结构课程---4、栈(是什么)

    php数据结构课程---4.栈(是什么) 一.总结 一句话总结: 栈(stack),它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算. 1.栈的链表实现? 定义node,设置属性d ...

  2. java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表

    java实现 数据结构:链表. 栈. 队列.优先级队列.哈希表   数据结构javavector工作importlist 最近在准备找工作的事情,就复习了一下java.翻了一下书和网上的教材,发现虽然 ...

  3. 我理解的数据结构(二)—— 栈(Stack)

    我理解的数据结构(二)-- 栈(Stack) 一.栈基础 栈是一种线性结构 相比较数组,栈对应的操作是数组的子集 只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶 栈是一种后进先出的数据结构 ...

  4. JS数据结构第四篇 --- 栈

    一.什么是数据结构栈 在数据结构中有一个栈结构,在内存空间中也有一个栈空间,这两个”栈“是两个不同的概念.这篇我们说的是数据结构中的栈.栈是一种特殊的线性表,特殊性在哪?就是只能在栈顶进行操作,往栈顶 ...

  5. 数据结构之队列and栈总结分析

    一.前言: 数据结构中队列和栈也是常见的两个数据结构,队列和栈在实际使用场景上也是相辅相成的,下面简单总结一下,如有不对之处,多多指点交流,谢谢. 二.队列简介 队列顾名思义就是排队的意思,根据我们的 ...

  6. 数据结构:C_顺序栈的实现

    数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typede ...

  7. 用JS描述的数据结构及算法表示——栈和队列(基础版)

    前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...

  8. C++数据结构之Stack(栈)

    stack,栈,是好比堆积木似的数据结构,从上之下堆积,取出时按"LIFO"-last int first out后进先出的规则.栈一般为线程所独有,也就是每个线程有其自有的栈,与 ...

  9. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

随机推荐

  1. Java线程池入门必备

    线程池 一. 线程池的简介 1.什么是线程池?   最早期的工作线程处理任务的模型.一个任务的到来,会伴随着线程的创建,当处理完任务后,线程会被销毁,资源回收.这种一个任务一个线程一系列创建销毁的模式 ...

  2. jQuery Ajax封装(附带加载提示和请求结果提示模版)

    1.创建HTML文件(demo) <!doctype html> <html lang="en"> <head> <meta charse ...

  3. jquery滚动条事件

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  4. BeanUtils.copyProperties VS PropertyUtils.copyProperties

    作为两个bean属性copy的工具类,他们被广泛使用,同时也很容易误用,给人造成困然:比如:昨天发现同事在使用BeanUtils.copyProperties copy有integer类型属性的bea ...

  5. Python3.5学习笔记-文件操作

    在Python中,操作文件对象使用open函数来创建,下表列出了常用的操作file的函数: 序号 方法及描述 1.file.close() 关闭文件.关闭后文件不能再进行读写操作. 2.file.fl ...

  6. EventUtil.addHandler方法

    EventUtil.addHandler: addHandler 方法,职责是分别视情况而定来使用DOM0级方法.DOM2级方法或IE方法来添加事件.   这个方法属于一个名字叫EventUtil的对 ...

  7. Python系列教程(三):输入和输出

    1.1 raw_input() 在Python中,获取键盘输入的数据的方法是采用 raw_input 函数(至于什么是函数,咱们以后的章节中讲解),那么这个 raw_input 怎么用呢? 看如下示例 ...

  8. Java IO在实际项目开发中应用

    IO是java绕不过去的槛,在开发中io无处不在, 正如同 世界上本没有路,java io写多了,也就知道了大体是什么意思,在读完thinking in java 感觉就更清晰了,结合具体的业务场景, ...

  9. Java--回调接口

    回调接口: 我们都知道,一个线程在运行中,遇到一个耗时操作(方法)时,会开启另外一个线程,即所谓 -- 异步 .java中 回调接口 也必然应用与异步加载. 所谓 回调接口 ,也就是线程运行中 遇到一 ...

  10. [BZOJ2783/JLOI2012]树 树上倍增

    Problem 树 题目大意 给出一棵树,求这个树上的路径的数量,要求路径上的点权和等于s且路径的上每个点深度不同. Solution 这个题目可以用不少方法做. 首先,路径上每个节点的深度不同决定了 ...