基于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 相关文章推荐
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
Mar 26 PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 PHP
解析strtr函数的效率问题
Jun 26 PHP
php与java通过socket通信的实现代码
Oct 21 PHP
ThinkPHP模板替换与系统常量及应用实例教程
Aug 22 PHP
PHP正则验证Email的方法
Jun 15 PHP
PHP抽奖算法程序代码分享
Oct 08 PHP
Yii2实现让关联字段支持搜索功能的方法
Aug 10 PHP
ThinkPHP 模板引擎使用详解
May 07 PHP
PHP如何实现订单的延时处理详解
Dec 30 PHP
php-fpm服务启动脚本的方法
Apr 27 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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在apache环境下实现gzip配置方法
2015/04/02 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
Using the TextRange Object
2006/10/14 Javascript
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
JavaScript 创建对象
2009/07/17 Javascript
Javascript var变量隐式声明方法
2009/10/19 Javascript
JavaScript this调用规则说明
2010/03/08 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
JavaScript Split()方法
2015/12/18 Javascript
jQuery实现多级联动下拉列表查询框
2016/01/18 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
2019/07/26 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
python字符串查找函数的用法详解
2019/07/08 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
python groupby 函数 as_index详解
2019/12/16 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
20佳惊艳的HTML5应用程序示例分享
2011/05/03 HTML / CSS
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
优秀教师获奖感言
2014/01/31 职场文书
企业宣传口号
2014/06/12 职场文书
人生感悟经典句子
2019/08/20 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技
python获取带有返回值的多线程
2022/05/02 Python