基于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 array 的加法操作代码
Jul 24 PHP
PHP 导出Excel示例分享
Aug 18 PHP
php中文字符串截取方法实例总结
Sep 30 PHP
php获取随机数组列表的方法
Nov 13 PHP
PHP中文编码小技巧
Dec 25 PHP
php程序总是提示验证码输入有误解决方案
Jan 07 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
Jan 19 PHP
Yii隐藏URL中index.php的方法
Jul 12 PHP
PHP快速排序quicksort实例详解
Sep 28 PHP
php+mysql查询实现无限下级分类树输出示例
Oct 03 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
Apr 12 PHP
使用PHP开发留言板功能
Nov 19 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 中的一些经验积累
2006/10/09 PHP
在PHP里得到前天和昨天的日期的代码
2007/08/16 PHP
PHP MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
用javascript操作xml
2006/11/04 Javascript
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
js判断60秒以及倒计时示例代码
2014/01/24 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
jQuery图片加载显示loading效果
2016/11/04 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
es6函数之尾调用优化实例分析
2020/04/25 Javascript
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
Python绘制七段数码管实例代码
2017/12/20 Python
基于python 二维数组及画图的实例详解
2018/04/03 Python
Python正则表达式和元字符详解
2018/11/29 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
机工车间主任岗位职责
2014/03/05 职场文书
服务整改报告
2014/11/06 职场文书
先进党组织事迹材料
2014/12/26 职场文书
付款证明格式范文
2015/06/19 职场文书
小学生暑假安全公约
2015/07/14 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS
索尼ICF-5900W收音机测评
2022/04/24 无线电