所以我需要创建一个程序,可以确定一组括号是否平衡,以及确定哪个括号是第一个“违规括号”,意味着第一个括号不是平衡对的一部分。
我只能想出一个程序,确定括号的集合是否平衡,但无法找出不属于一对的第一个括号的常用检测方法。
Ex:在“(())(()中(”第五个括号是第一个违规括号。
我已经尝试了很多方法来找到第一个违规的括号,但它们并不适用于每一个案例,所以如果你有更好的算法,请告诉我。 我应该考虑堆栈概念来实现它。
答案 0 :(得分:4)
1. set up a stack
2. scan the string char by char
2.1. for each left parenthesis "("
2.1.1. push its location onto the stack
2.2. for each right parenthesis ")"
2.2.1. if stack is empty then
2.2.1.1. you have too many right parentheses
2.2.1.2. current location is first offending location
2.2.2. else
2.2.2.1. pop one entry from the stack
3. at end of string scan
3.1. if stack is empty then
3.1.1. all parentheses balance
3.2. else
3.2.1. you have too many left parentheses
3.2.2. first entry on stack indicates first offending location
答案 1 :(得分:0)
按照 Perl 脚本我用来标记第一个不匹配的括号:
#!/usr/bin/perl
use strict;
undef $/;
$_= <>; # slurp input
my $P = qr{[^()]*}; # $P = not parentheses
# repace matched parentheses by marks
while(s! \( ($P) \) !\cA$1\cB!gx){}
while(s!^ ($P) \( (.*) \) ($P) $ !$1\cB$2\cB$3!sgx){}
s!([()])! → $1!; # mark the first unmatched ()
y!\cA\cB!()!; # replace marks
print
用法:
$ cat f
1(2(3(4(5)6)7)8(9)10(
11(12)13)14) (15 ( and )
(16(17(18)19)
20)21(22)23
$ parentesis f
1(2(3(4(5)6)7)8(9)10(
11(12)13)14) → (15 ( and )
(16(17(18)19)
20)21(22)23