基于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语句的实现代码
Jun 24 PHP
yii框架源码分析之创建controller代码
Jun 28 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
Apr 26 PHP
PHP计算2点经纬度之间的距离代码
Aug 12 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
Jan 03 PHP
PHP 之 写时复制介绍(Copy On Write)
May 13 PHP
php利用反射实现插件机制的方法
Mar 14 PHP
Netbeans 8.2将支持PHP7 更精彩
Jun 13 PHP
PHP脚本自动识别验证码查询汽车违章
Dec 20 PHP
PHP编程实现计算抽奖概率算法完整实例
Aug 09 PHP
PHP学习笔记之session
May 06 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 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
解析thinkphp的左右值无限分类
2013/06/20 PHP
PHP-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
js 与或运算符 || && 妙用
2009/12/09 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
js控制文本框输入的字符类型方法汇总
2015/06/19 Javascript
轮播的简单实现方法
2016/07/28 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
vue的事件绑定与方法详解
2017/08/16 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
python 正则式 概述及常用字符
2009/05/07 Python
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
HTML中使用SVG与SVG预定义形状元素介绍
2013/06/28 HTML / CSS
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
幼儿园庆六一游园活动方案
2014/01/29 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
节能宣传周活动总结
2014/05/08 职场文书
超市创业计划书
2014/09/15 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python