基于PHP实现栈数据结构和括号匹配算法示例


Posted in PHP onAugust 10, 2017

本文实例讲述了基于PHP实现栈数据结构和括号匹配算法。分享给大家供大家参考,具体如下:

栈,体现的是后进先出,即LIFO。队列,体现的是先进先出,即FIFO。

栈操作:

array_pop() //尾出
array_push() //尾进

array_shift()//头进
array_unshift()//头出

用例:验证一个数学算式是否正确,比如{2*3[x*y+5+m*(i-j)/3]+k*(4+(t+9))}。

分析:对于一个算式的正确与否,就是体现在,各种括号的匹配上,括号完全匹配,算式就没问题,那怎么来检验一个算式里的括号匹配呢,碰到过很多人想着用正则。我是想不通这正则怎么写,怎么实现嵌套关系。这个时候栈就派上用场了。看下边代码。

function checkMatch($str){
  if(!$str)return false;
  $arr = str_split($str);
  $left = array('{','[','(');
  $right = array('}',']',')');
  $stack = array();
  reset($arr);  //使用while遍历数组需要先reset(),防止遍历不完整
  while(list($key, $val) = each($arr)){
    if(in_array($val,$left,true)){
      //入栈
      array_push($stack,$val); //把出现的全部左括号压入栈中
    }else if(in_array($val,$right,true)){
      $topStack = end($stack); //如果出现右括号,则栈顶的元素肯定是与其匹配的左括号(因为括号是对应的),先取出栈顶元素。
      if(isset($topStack) && !empty($topStack)){
        if(array_search($val,$right,true) === array_search($topStack,$left,true)){ //判断当前右括号是不是与左括号匹配
          //出栈
          array_pop($stack); //匹配的话就pop出栈
        }else{
          //
          return false; //左右不匹配
        }
      }else{
        //
        return false; //右括号多,因为没取出对应的左括号
      }
    }
  }
  return empty($stack) ? true : false;  //循环完成后判断$stack中是否还有值,有的话证明左括号多
}
$test = '{2*3[x*y+5+m*(i-j)/3]+k*(4+(t+9))}';
var_dump ( checkMatch ( $test ) );

上述代码中的栈,是由array_pop和array_push实现的;同理,也可以用array_shift和array_unshift实现。

附:队列操作

array_shift() //头出
array_push() //尾进

array_unshift //头进
array_pop //尾出

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php中的一个中文字符串截取函数
Feb 14 PHP
一家之言的经验之谈php+mysql扎实个人基本功
Mar 27 PHP
php foreach、while性能比较
Oct 15 PHP
linux下删除7天前日志的代码(php+shell)
Jan 02 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
Mar 27 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
Jun 08 PHP
PHP判断浏览器、判断语言代码分享
Mar 05 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
Dec 16 PHP
PHP实现基于文本的摩斯电码生成器
Jan 11 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
Aug 10 #PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 #PHP
Laravel实现定时任务的示例代码
Aug 10 #PHP
PHP编程实现计算抽奖概率算法完整实例
Aug 09 #PHP
PHP实现将标点符号正则替换为空格的方法
Aug 09 #PHP
php实现的redis缓存类定义与使用方法示例
Aug 09 #PHP
PHP编程实现脚本异步执行的方法
Aug 09 #PHP
You might like
redis 队列操作的例子(php)
2012/04/12 PHP
php中的静态变量的基本用法
2014/03/20 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
PHP连接MSSQL方法汇总
2016/02/05 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
node.js中的fs.futimesSync方法使用说明
2014/12/17 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
2018/09/13 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
跟老齐学Python之集成开发环境(IDE)
2014/09/12 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
python numpy中cumsum的用法详解
2019/10/17 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
行政经理的岗位职责
2013/11/23 职场文书
军神教学反思
2014/02/04 职场文书
小学三年级学生评语
2014/04/22 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
停车位租赁协议书
2014/09/24 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle