括号配对问题
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
现在,有一行括号序列,请你检查这行括号是否配对。
-
输入
-
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")" 四种字符
-
输出
-
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
-
样例输入
-
3 [(]) (]) ([[]()])
-
样例输出
-
No No
-
思路: 遍历,左边的括号就入栈 每次遇到右边的括号就出栈 比较两个括号是不是对称的 不是对称就返回false
-
<?php
$str = "";
$stack = [];
$A = ['(', '['];
$B = [')', ']'];
$map_A = ['(' => ')', '[' => ']'];
$map_B = [')' => '(', ']' => '['];
fwrite (STDOUT, "input N count is : ");
$N = trim(fgets (STDIN));
for ($i = 0; $i < $N; $i++) {
$str .= fgets (STDIN);
}
$rows = explode("\n", $str);
array_pop($rows);
foreach ($rows as $r) {
$r = str_split($r);
$stack = [];
foreach ($r as $k => $word) {
if (in_array($word, $A)) {
$stack[] = $word;
} else if (in_array($word, $B)) {
$pre_word = array_pop($stack);
$reverse_word = $map_B[$word];
if ($pre_word == $reverse_word) {
//echo "\nequal\n";
}
if (empty($stack)) {
echo "YES\n";
break;
}
}
}
if (count($stack)) {
echo "\nNO\n";
}
}