7-2 符号配对
分数 25
全屏浏览
切换布局
作者 DS课程组
单位 浙江大学
请编写程序检查C语言源程序中下列符号是否配对:/*
与*/
、(
与)
、[
与]
、{
与}
。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.
和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES
,否则输出NO
。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号
;如果缺少右符号,则输出左符号-?
。
输入样例1:
void test()
{
int i, A[10];
for (i=0; i<10; i++) { /*/
A[i] = i;
}
.
输出样例1:
NO
/*-?
输入样例2:
void test()
{
int i, A[10];
for (i=0; i<10; i++) /**/
A[i] = i;
}]
.
输出样例2:
NO
?-]
输入样例3:
void test()
{
int i
double A[10];
for (i=0; i<10; i++) /**/
A[i] = 0.1*i;
}
.
输出样例3:
YES
鸣谢用户 王渊博 补充数据!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdio.h>//这题主要理解的是,!!判断符号是否配对要从栈顶的元素开始
int isx(char a,char b){//判断符号是否配对
if(a=='/'&&b=='*')
return 1;
if(a=='['&&b==']')
return 1;
if(a=='{'&&b=='}')
return 1;
if(a=='('&&b==')')
return 1;
return 0;
}
int main(){
char s[200],a[9999];
int i,top=-1;
for(i=0;;i++){
scanf("%c",&a[i]);
if(a[i]=='('||a[i]=='['||a[i]=='{'){//若是左边符号,则入栈
s[++top]=a[i];
}else if(a[i]==')'||a[i]==']'||a[i]=='}'){
if(isx(s[top],a[i])){//若是右边符号,如果与栈顶的符号匹配,则出栈,否则进栈
top--;
}else{
s[++top]=a[i];
}
}
else if(a[i-1]=='/'&&a[i]=='*'){//将/* 和*/以 / 和 * 形式 入栈
s[++top]='/';
a[i-1]='f';//把入栈后的/*销毁,以防二次进栈
a[i]='f';
}else if(a[i]=='/'&&a[i-1]=='*'){
s[++top]='*';
a[i-1]='f';
a[i]='f';
}
if(a[i-1]=='.'&&a[i]=='\n')
break;
}
int q,flag;
for(i=top;i>=0;i--){//从栈顶元素开始向下找不匹配的
flag=0;
for(q=0;q<top;q++){
if(isx(s[q],s[i])){//当他们匹配,则将左边符号销毁,flag则为1
flag=1;
s[q]='f';
break;
}
if(s[i]=='f'){//若是等于f说明这个符号先前已经匹配
flag=1;
break;
}
}
if(flag==0){//如果flag为零,即有元素不匹配,则输出
printf("NO\n");
if(s[i]=='('||s[i]=='['||s[i]=='{'){
printf("%c-?",s[i]);
}else if(s[i]==')'||s[i]==']'||s[i]=='}'){
printf("?-%c",s[i]);
}
else if(s[i]=='/')
printf("/*-?");
else if(s[i]=='*')
printf("?-*/");
return 0;
}
}
printf("YES");
return 0;
}
易错样例
-
/*/*/
-
.
输出
-
NO
-
/*-?