括号配对问题
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
现在,有一行括号序列,请你检查这行括号是否配对。
-
输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符 输出
- 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No 样例输入
-
3 [(]) (]) ([[]()])
样例输出
-
No No Yes
该题是典型的栈的应用,遇见“[”或者“(”,压入栈中。
如果遇见“)”或者“]”,把栈顶元素和当前括号比对是否可以配对,如果可以,就出栈,否则不能匹配。
例如:[([ ][ ])],下面模拟这个过程
1.s:[
2.s:[(
3.s:[([
4.s:[([ 来了一个“]”,栈顶元素是“[”,和“]”可以配对,出栈。
s:[(
5:s:[([
6.s:[([ 来了一个“]”,栈顶元素是“[”,和“]”可以配对,出栈。
s:[(
7.s:[( 来了一个“)”,栈顶元素是“(”,和“)”可以配对,出栈。
s:[
8.s:[ 来了一个“]”,栈顶元素是“[”,和“]”可以配对,出栈。
s:
代码如下:
01.
#include <stdio.h>
02.
int
main()
03.
{
04.
int
n,i,j,s;
05.
char
k[10003],r,p[10000];
06.
scanf
(
"%d"
,&n);
07.
for
(j=0;j<n;j++)
08.
{
09.
i=1;s=0;
10.
scanf
(
"%s"
,p);
11.
while
(r=p[s++])
12.
{
13.
if
(r==
'('
||r==
'['
) k[i++]=r;
14.
else
if
(r==
')'
)
15.
{
16.
if
(k[i-1]==
'('
) i--;
17.
else
{i=10;
break
;}
18.
}
19.
else
if
(r==
']'
)
20.
{
21.
if
(k[i-1]==
'['
) i--;
22.
else
{i=10;
break
;}
23.
}
24.
}
25.
if
(i>1)
printf
(
"No\n"
);
26.
else
printf
(
"Yes\n"
);
27.
}
28.
return
0;
29.
}