基于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中Smarty模板初体验
Aug 08 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
Oct 24 PHP
php多文件上传功能实现原理及代码
Apr 18 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
Oct 25 PHP
json的键名为数字时的调用方式(示例代码)
Nov 15 PHP
php中的strpos使用示例
Feb 27 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
Linux下PHP加速器APC的安装与配置笔记
Oct 24 PHP
php查找指定目录下指定大小文件的方法
Nov 28 PHP
PHP中使用BigMap实例
Mar 30 PHP
Yii框架批量插入数据扩展类的简单实现方法
May 23 PHP
laravel框架使用阿里云短信发送消息操作示例
Feb 15 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 启动报错如何解决
2014/01/17 PHP
php获取linux命令结果的实例
2017/03/13 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
js从Cookies里面取值的简单实现
2014/06/30 Javascript
使用jQuery将多条数据插入模态框的实现代码
2014/10/08 Javascript
JS模拟的Map类实现方法
2016/06/17 Javascript
JavaScript编程中实现对象封装特性的实例讲解
2016/06/24 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
js获取地址栏中传递的参数(两种方法)
2017/02/08 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
2017/08/25 Javascript
写一个移动端惯性滑动&回弹Vue导航栏组件 ly-tab
2018/03/06 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
2019/07/19 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
跟老齐学Python之模块的加载
2014/10/24 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
python 字符串追加实例
2019/07/20 Python
python实现PID算法及测试的例子
2019/08/08 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
制药工程专业应届生求职信
2013/09/24 职场文书
年度考核自我鉴定
2013/11/09 职场文书
优秀应届毕业生自荐信
2013/11/16 职场文书
服装行业创业计划书范文
2014/02/05 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
Win11快速关闭所有广告推荐
2022/04/19 数码科技