基于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 裁剪图片成固定大小代码方法
Sep 09 PHP
Discuz 6.0+ 批量注册用户名
Sep 13 PHP
完美解决PHP中的Cannot modify header information 问题
Aug 12 PHP
PHP上传图片进行等比缩放可增加水印功能
Jan 13 PHP
php教程之phpize使用方法
Feb 12 PHP
php数组删除元素示例
Mar 21 PHP
PHP GD库生成图像的几个函数总结
Nov 19 PHP
php实现通过ftp上传文件
Jun 19 PHP
php单一接口的实现方法
Jun 20 PHP
thinkphp多层MVC用法分析
Dec 30 PHP
PHP错误和异常处理功能模块示例
Nov 12 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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简单判断字符串是否包含另一个字符串的方法
2016/03/25 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
快速学习jQuery插件 Form表单插件使用方法
2015/12/01 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
微信小程序模板消息推送的两种实现方式
2019/08/27 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
python 布尔操作实现代码
2013/03/23 Python
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
Python深入学习之装饰器
2014/08/31 Python
Python Lambda函数使用总结详解
2019/12/11 Python
python中如何使用insert函数
2020/01/09 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
Python实现异步IO的示例
2020/11/05 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
.net软件工程师面试题
2015/03/31 面试题
海量信息软件测试笔试题
2015/08/08 面试题
计算机专业个人求职信范例
2013/09/23 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
大学生入党自荐书
2015/03/05 职场文书
Mysql Show Profile
2021/04/05 MySQL
mysql 索引合并的使用
2021/08/30 MySQL