You are given a string consisting of parentheses () and []. A string of this type is said to be correct:
(a) if it is the empty string
(b) if A and B are correct, AB is correct,
(c) if A is correct, (A) and [A] is correct.
Write a program that takes a sequence of strings of this type and check their correctness. Yourprogram can assume that the maximum string length is 128.
Input
The file contains a positive integer n and a sequence of n strings of parentheses ‘()’ and ‘[]’, one stringa line.
Output
A sequence of ‘Yes’ or ‘No’ on the output file.
Sample Input
3
([])
(([()])))
([()[]()])()
Sample Output
Yes
No
Yes
题目描述:括号匹配问题,运用栈的先进后出性质即可。
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef struct stu{
int k;int m;
}st;
int cmp(st a,st b)
{
if(a.m==b.m)
return a.k>b.k;
else
return a.m<b.m;
}
int main()
{
st s[20];
int b[20][20];
int i,j,k,t,m,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&m);
memset(b,0,sizeof(b));
n=0;
for(i=0;i<m;i++)
{
scanf("%d",&s[i].m);
s[i].k=i;
}
k=m;
while(k)
{
sort(s,s+k,cmp);
if(s[k-1].m>k)
{n=1;break;}
for(i=k-2,j=0;j<s[k-1].m;i--)
{
s[i].m--;
b[s[i].k][s[k-1].k]=1;
b[s[k-1].k][s[i].k]=1;
j++;
}
s[k-1].m=0;
for(i=0;i<k;i++)
{
if(s[i].m<0)
{n=1;break;}
}
if(n==1)
break;
k--;
}
if(n)
printf("NO\n");
else
{
printf("YES\n");
for(i=0;i<m;i++)
{
printf("%d",b[i][0]);
for(j=1;j<m;j++)
printf(" %d",b[i][j]);
printf("\n");
}
}
if(t>0)
printf("\n");
}
return 0;
}