博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实战PHP数据结构基础之栈
阅读量:7168 次
发布时间:2019-06-29

本文共 3658 字,大约阅读时间需要 12 分钟。

栈和队列

栈和队列和之前讲到的 一样都是线性结构。

栈有什么特点

栈遵循后进先出的原则(LIFO)。这意味着栈只有一个出口用来压入元素和弹出元素,当我们执行压入或者弹出操作的时候要注意栈是否已满或者栈是否是空的。

常见操作

还是废话不多说,直接来看我们对栈执行的常用操作。

  • push
  • pop
  • top
  • isEmpty
  • ...

PHP实现

首先我们定义一个StackInterface。

interface StackInterface{    public function push(string $item);    public function pop();    public function top();    public function isEmpty();}复制代码

来看基于数组的栈实现

class ArrStack implements StackInterface{    private $stack;    private $limit;    public function __construct(int $limit = 20)    {        $this->limit = $limit;        $this->stack = [];    }    public function __get($val)    {        return $this->$val;    }    public function push(string $data = null)    {        if (count($this->stack) < $this->limit) {            array_push($this->stack, $data);        } else {            throw new \OverflowException('stack is overflow');        }    }    public function pop()    {        if ($this->isEmpty()) {            throw new \UnderflowException('stack is empty');        } else {            return array_pop($this->stack);        }    }    public function isEmpty()    {        return empty($this->stack);    }    public function top()    {        return end($this->stack);    }复制代码

得益于PHP强大的array结构,我们轻而易举的写出来了栈的基本操作方法。果然世界上最好的语言名不虚传。

那有同学说了,你说栈和之前的链表都是线性结构,那可不可以直接使用链表实现栈呢?这个问题非常犀利啊,答案是可以的。

可能机智的同学已经猜到了,我之前已经定义了一个栈接口,那栈的实现肯定不止只有上面一种哈。来看基于链表的实现。

class LinkedListStack implements StackInterface{    private $stack;    private $limit;    public function __construct(int $limit)    {        $this->limit = $limit;        $this->stack = new LinkedList();    }    public function top()    {        return $this->stack->getNthNode($this->stack->getSize() - 1)->data;    }    public function isEmpty()    {        return $this->stack->getSize() === 0;    }    public function pop()    {        if ($this->isEmpty()) {            throw new \UnderflowException('stack is empty');        } else {            $lastItem = $this->top();            $this->stack->deleteLast();            return $lastItem;        }    }    public function push(string $item)    {        if ($this->stack->getSize() < $this->limit) {            $this->stack->insert($item);        } else {            throw new \OverflowException('stack is overflow');        }    }复制代码

里面涉及到了之前的链表实现,不了解细节的同学可以去看看。有同学又问,那栈到底有什么用处?这个问题非常好,来看一个需求。

请实现一个数学表达式检查类,输入一个下面表达式,预期结果为true。

"8 * (9 -2) + { (4 * 5) / ( 2 * 2) }复制代码

下面的为false。

"5 * 8 * 9 / ( 3 * 2 ) )"复制代码

下面的也为false。

"[{ (2 * 7) + ( 15 - 3) ]"复制代码

自己想一下,再往下看实现。

class ExpressionChecker{    //$expressions[] = "8 * (9 -2) + { (4 * 5) / ( 2 * 2) }";    //$expressions[] = "5 * 8 * 9 / ( 3 * 2 ) )";    //$expressions[] = "[{ (2 * 7) + ( 15 - 3) ]";    public function check(string $expression): bool    {        $stack = new \SplStack();        foreach (str_split($expression) as $item) {            switch ($item) {                case '{':                case '[':                case '(':                    $stack->push($item);                    break;                case '}':                case ']':                case ')':                    if ($stack->isEmpty()) return false;                    $last = $stack->pop();                    if (                        $item == '{' && $last != '}' ||                        $item == '(' && $last != ')' ||                        $item == '[' && $last != ']'                    )                        return false;                    break;            }        }        if ($stack->isEmpty()) {            return true;        }        return false;    }}复制代码

专题系列

PHP基础数据结构专题系列目录地址: 主要使用PHP语法总结基础的数据结构和算法。还有我们日常PHP开发中容易忽略的基础知识和现代PHP开发中关于规范、部署、优化的一些实战性建议,同时还有对Javascript语言特点的深入研究。

转载地址:http://gjqwm.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
DNS配置
查看>>
MPLS ××× 互访关系控制
查看>>
如果说搞技术没前途,那是因为你技术搞的还不够深
查看>>
柳州市第一职业技术学校中心机房双活虚拟引擎容灾备份系统需求
查看>>
我的友情链接
查看>>
NV 3D viosn的设置
查看>>
在CentOS系统下安装Red5
查看>>
移动端消除click事件的延迟效果
查看>>
bgp与igp交互的配置
查看>>
[官方文档] oracle官方文档总汇(9i,10g,11gR1, 11gR2)
查看>>
宝马与F团合作能否再造营销奇迹?
查看>>
10 Linux程序包管理
查看>>
Exchange2010升级SP2 (包含各角色)
查看>>
实施Exchange 2013中的分层通讯簿
查看>>
Windows下安装MySql后,出现的错误解决办法
查看>>
oracle创建只读用户
查看>>
详解mysql的tee功能 并利用其记录相关操作
查看>>
Python function
查看>>
Linux系统中程序库文件简介
查看>>