Pin*_*uin 9 php string math validation
如果善于PHP的人可以建议如何在表达式中验证括号,我会徘徊:
( 5 * 3 [ 6 ) - 6]
Run Code Online (Sandbox Code Playgroud)
这是错误的表达.我需要一个功能来做到这一点.这是我到目前为止所尝试的:
<?php
function hasMatchedParenthesis($string) {
$counter1 = 0;
$counter2 = 0;
$length = strlen($string);
for ($i = 0;$i < $length; $i++) {
$char = $string[$i];
if( $char == '(' ) {
$counter1 ++;
} elseif( $char == ')' ) {
$counter1 --;
}
for($j =0;$j < $length; $j++) {
$char = $string[$j];
if( $char == '[' ) {
$counter2 ++;
} elseif( $char == ']' ) {
$counter2 --;
}
}
if( $counter1 < 0 || $counter2 < 0) {
return false;
}
}
echo 'ok';;
}
hasMatchedParenthesis('[5] * 3 - ( 4 - 7 * [3-6])'); // this is ok!
hasMatchedParenthesis('( 5 * 3 [ 6 ) - 6]'); // this returns as TRUE, but it is not!
?>
Run Code Online (Sandbox Code Playgroud)
请帮助我解决'[6]'事情的验证!我不知道怎么做:(
Sho*_*hoe 10
我想到的第一个想法是使用堆栈.PHP提供了两个将数组视为堆栈的函数:array_push和array_pop.我们可以使用它们来创建一个堆栈0(我们在一个开口内()和1(我们在一个内部[)并检查每个闭括号是否与我们插入的最后一个值匹配:
function hasMatchedParenthesis($string) {
$len = strlen($string);
$stack = array;
for ($i = 0; $i < $len; $i++) {
switch ($string[$i]) {
case '(': array_push($stack, 0); break;
case ')':
if (array_pop($stack) !== 0)
return false;
break;
case '[': array_push($stack, 1); break;
case ']':
if (array_pop($stack) !== 1)
return false;
break;
default: break;
}
}
return (empty($stack));
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可以将此扩展到任何其他字符对,包括{和}:
case '{': array_push($stack, 2); break;
case '}':
if (array_pop($stack) !== 2)
return false;
break;
Run Code Online (Sandbox Code Playgroud)