本文
介绍了栈的数据结构和基于PHP的括号匹配算法,供大家
参考:
堆栈体现了先出,即后进先出的队列,它体现了先进先出FIFO,是。
堆栈
操作:
(array_pop) / /丙二醇醚
(array_push) /尾为
或
(array_shift) /头。
(array_unshift) /头
使用案例:验证一个数学公式是
正确的,如{ 2×3 { x×y + 5 + m×(I-J) / 3 } + K *(4 +(T + 9))}。
分析:公式的正确与否,反映在括号的匹配中。括号是完全匹配的。这个算法没有问题。那么如何测试一个公式中括号的匹配呢很多人认为使用正则表达式。我想不出如何编写这个规则,如何实现嵌套关系。
功能checkmatch($str){
如果(!STR)返回false;
$ ARR = str_split($str);
左=数组({、{、());
数组(}、}、);
堆栈=数组();
复位($ ARR); / /而(复位)需要遍历数组,防止遍历是不完整的
而(表(美元美元关键,Val)=每($ ARR)){
如果(in_array($ Val,左美元,真)){
堆栈
array_push(合栈,$ Val); / /把整个左括号栈
} else if(in_array($ Val,美元吧,真的)){
topstack美元=端($栈); / /如果括号元素堆栈的顶部必须与左括号匹配(因为括号对应),取出栈顶。
如果(isset($ topstack)!空(美元topstack)){
如果(array_search($ Val,美元吧,真的)= array_search(topstack美元,美元离开,真)){ / /确定当前的左、右括号不匹配的括号
堆栈
array_pop($栈); / /,在栈的话
其他{ }
返回false;
}
其他{ }
返回false;右括号,因为没有
删除相应的左括号。
}
}
}
返回空($堆栈)为真:假;循环结束后判断堆栈是否有任何值,即多个左括号。
}
为测试={ 2×3 { x×y + 5 + m×(I-J) / 3 } + K *(4 +(T + 9)});
var_dump(checkmatch($试验));
在上面的代码堆栈是由array_pop和array_push实施;以同样的方式,也可以和array_shift和array_unshift实施。
附录:队列操作
(array_shift) /头
(array_push) /尾为
或
array_unshift / /头。
array_pop / /丙二醇醚
关于PHP相关内容的更多读者感兴趣的读者可以看到特别站:PHP数据结构和算法
教程 希望本文能对PHP
程序设计有所帮助。