基于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 相关文章推荐
信用卡效验程序
Oct 09 PHP
php 日期和时间的处理-郑阿奇(续)
Jul 04 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
Nov 26 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
Aug 28 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
Jan 11 PHP
各种快递查询--Api接口
Apr 26 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
Sep 11 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
May 28 PHP
PHP simplexml_import_dom()函数讲解
Feb 03 PHP
php实现微信分享朋友链接功能
Feb 18 PHP
Laravel 关联模型-关联新增和关联更新的方法
Oct 10 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+swoole对client数据实时更新(一)
2016/01/07 PHP
php实现socket推送技术的示例
2017/12/20 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
了解JavaScript函数中的默认参数
2019/05/30 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
tornado框架blog模块分析与使用
2013/11/21 Python
使用graphics.py实现2048小游戏
2015/03/10 Python
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
python如何将两个txt文件内容合并
2019/10/18 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
2020/02/29 Python
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
财务会计专业个人求职信范本
2014/01/08 职场文书
水利学院求职自荐书
2014/02/01 职场文书
商场促销活动方案
2014/02/08 职场文书
违反校纪校规检讨书
2014/02/15 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
2014公司年终工作总结
2014/12/19 职场文书
世界名著读书笔记
2015/06/25 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
Redis入门基础常用操作命令整理
2022/06/01 Redis