基于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获得文件扩展名三法
Nov 25 PHP
php面向对象全攻略 (十四) php5接口技术
Sep 30 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
Jan 18 PHP
PHP 观察者模式的实现代码
May 10 PHP
php上传文件中文文件名乱码的解决方法
Nov 01 PHP
PHP过滤★等特殊符号的正则
Jan 27 PHP
PHP+memcache实现消息队列案例分享
May 21 PHP
Laravel 5.3 学习笔记之 错误&日志
Aug 28 PHP
php cookie 详解使用实例
Nov 03 PHP
PHP chr()函数讲解
Feb 11 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
Apr 15 PHP
Laravel框架实现调用百度翻译API功能示例
May 30 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/12/05 PHP
php 什么是PEAR?(第三篇)
2009/03/19 PHP
将文件夹压缩成zip文件的php代码
2009/12/14 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
2011/11/02 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
JQuery 操作/获取table具体代码
2013/06/13 Javascript
深入解读JavaScript中的Hoisting机制
2015/08/12 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
JavaScript获取某一天所在的星期
2019/09/05 Javascript
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
python__name__原理及用法详解
2019/11/02 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
python except异常处理之后不退出,解决异常继续执行的实现
2020/04/25 Python
YSL Beauty加拿大官方商城:圣罗兰美妆加拿大
2017/05/15 全球购物
德国高尔夫商店:Par71.de
2020/11/29 全球购物
Java的基础面试题附答案
2016/01/10 面试题
大学生全国两会报告感想
2014/03/17 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
在校实习生求职信
2014/06/18 职场文书
七一讲话心得体会
2014/09/05 职场文书
大学生毕业个人总结
2015/02/15 职场文书
信息技术教研组工作总结
2015/08/13 职场文书