PTA 7-7 括号匹配 (18分)
输入格式:
在一行中输入一段C语言代码,长度不超过1000个字符(行末以换行符结束)。
输出格式:
第一行输出左括号的数量和右括号的数量,中间以一个空格间隔。
若括号是匹配的,在第二行打印YES,否则打印NO。
输入样例1:
for(int i=0; i<v; i++){ visited[i] = 0; for(int j=0; j<v; j++) scanf("%d",&(g->Adj[i][j])); }
输出样例1:
8 8
YES
输入样例2:
for(int i=0; i<v; i++) a(i]=0;
输出样例2:
2 2
NO
#include<stdio.h>
#include<string.h>
int main()
{
char a[1005],b[1005],c[1005];
int b1=0,c1=0,len,k=0,top=-1,m=0;
gets(a);
len=strlen(a);
for(int i=0;i<len;i++)
{ //将输入字符串中括号按顺序存入b数组
if(a[i]=='{'||a[i]=='('||a[i]=='[')
{
b[k++]=a[i];
b1++;//b1计左括号个数
}
if(a[i]=='}'||a[i]==')'||a[i]==']')
{
b[k++]=a[i];
c1++;//c1计右括号个数
}
}
printf("%d %d\n",b1,c1);
for(int j=0;j<k;j++)
{//遇左括号入栈,b[j]为右括号时必须出栈,否则"NO",eg:"(})",保证每次循环进一个if
if(b[j]=='('||b[j]=='['||b[j]=='{')
{
top++;
c[top]=b[j];
m++;
}
if(b[j]==')'&&c[top]=='('||b[j]==']'&&c[top]=='['||b[j]=='}'&&c[top]=='{')
{
top--;
m++;
}
}
if(top==-1&&m==k)
printf("YES");
else
printf("NO");
return 0;
}