基于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 破解防盗链图片函数
Dec 09 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
Nov 01 PHP
兼容性比较好的PHP生成缩略图的代码
Jan 12 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
Nov 10 PHP
input file获得文件根目录简单实现
Apr 26 PHP
php在window iis的莫名问题的测试方法
May 14 PHP
php中base_convert()进制数字转换函数实例
Nov 20 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
Dec 22 PHP
php短网址和数字之间相互转换的方法
Mar 13 PHP
yii去掉必填项中星号的方法
Dec 28 PHP
Yii使用migrate命令执行sql语句的方法
Mar 15 PHP
PHP格式化显示时间date()函数代码
Oct 03 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
thinkPHP中volist标签用法示例
2016/12/06 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
PHP实现将base64编码字符串转换成图片示例
2018/06/22 PHP
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
理解Angular数据双向绑定
2016/01/10 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
python 实现敏感词过滤的方法
2019/01/21 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
python nmap实现端口扫描器教程
2020/05/28 Python
如何理解Python中包的引入
2020/05/29 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
一个精品风格的世界:Atterley
2019/05/01 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
会计实习生工作总结的自我评价
2013/10/07 职场文书
《雨点》教学反思
2014/02/12 职场文书
行政工作个人的自我评价
2014/02/13 职场文书
《鱼游到了纸上》教学反思
2014/02/20 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
党员评议自我评价
2015/03/03 职场文书
小学大队长竞选稿
2015/11/20 职场文书
Java设计模式中的命令模式
2022/04/28 Java/Android
详解CSS3浏览器兼容
2022/12/24 HTML / CSS