基于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&MYSQL服务器配置说明
Oct 09 PHP
PHP4之COOKIE支持详解
Oct 09 PHP
使用HMAC-SHA1签名方法详解
Jun 26 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
Aug 28 PHP
一个简单的php路由类
May 29 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
Jun 28 PHP
php利用header函数下载各种文件
Aug 24 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
PhpStorm本地断点调试的方法步骤
May 21 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
Oct 17 PHP
PHP SESSION跨页面传递失败解决方案
Dec 11 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
PHP 存储文本换行实现方法
2010/01/05 PHP
mayfish 数据入库验证代码
2010/04/30 PHP
求PHP数组最大值,最小值的代码
2011/10/31 PHP
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
Laravel中9个不经常用的小技巧汇总
2019/04/16 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
JQuery里面的几种选择器 查找满足条件的元素$("#控件ID")
2011/08/23 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
2015/12/14 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
JavaScript中this的用法实例分析
2016/12/19 Javascript
JavaScript & jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
使用nodeJs来安装less及编译less文件为css文件的方法
2017/11/20 NodeJs
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
inquirer.js一个用户与命令行交互的工具详解
2019/05/18 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
python执行get提交的方法
2015/04/29 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
python matplotlib库的基本使用
2020/09/23 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
机关党建工作汇报材料
2014/08/20 职场文书
地道战观后感
2015/06/04 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书