请编写程序检查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>
#include<stdlib.h>
#define Maxsize 105
typedef struct StackRecord *Stack;
struct StackRecord
{
char* Array;
int Top;
};
Stack creat()
{
Stack s=(Stack) malloc(sizeof(struct StackRecord));
s->Array=(char*) malloc(Maxsize*sizeof(char));
s->Top=-1;
return s;
}
int is_empty(Stack s)
{
if(s->Top==-1)
{
return 1;
}
else
{
return 0;
}
}
char top(Stack s)
{
return s->Array[s->Top];
}
void pop(Stack s)
{
s->Top--;
}
void push(Stack s,char x)
{
s->Array[++(s->Top)]=x;
}
char str[200];
char a[100];
int main()
{
int k=0;
char t;
while(gets(str))
{
if(str[0]=='.'&&!str[1])
{
break;
}
for(int i=0;str[i];i++)
{
if(str[i]=='('||str[i]==')'||str[i]=='['||str[i]==']'||str[i]=='{'||str[i]=='}')
{
a[k++]=str[i];
}
else if(str[i]=='/'&&str[i+1]=='*')
{
a[k++]='<';
i++;
}
else if(str[i]=='*'&&str[i+1]=='/')
{
a[k++]='>';
i++;
}
}
}
int flag=0;
Stack s=creat();
for(int i=0;i<k;i++)
{
if(a[i]=='('||a[i]=='{'||a[i]=='['||a[i]=='<')
{
push(s,a[i]);
}
else if(a[i]==')')
{
if(s->Top!=-1&&top(s)=='(')
{
pop(s);
}
else
{
t=a[i];
flag=1;
break;
}
}
else if(a[i]==']')
{
if(s->Top!=-1&&top(s)=='[')
{
pop(s);
}
else
{
t=a[i];
flag=1;
break;
}
}
else if(a[i]=='}')
{
if(s->Top!=-1&&top(s)=='{')
{
pop(s);
}
else
{
t=a[i];
flag=1;
break;
}
}
else if(a[i]=='>')
{
if(s->Top!=-1&&top(s)=='<')
{
pop(s);
}
else
{
t=a[i];
flag=1;
break;
}
}
}
if(!flag && is_empty(s)) printf("YES\n");
else{
printf("NO\n");
if(!is_empty(s)){
if(top(s)=='<') printf("/*-?\n");
else printf("%c-?\n", top(s));
}else{
if(t=='>') printf("?-*/\n");
else printf("?-%c\n", t);
}
}
return 0;
}