请编写程序检查C语言源程序中下列符号是否配对:/与/、(与)、[与]、{与}。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。
输入样例1:
void test()
{
int i, A[10];
for (i=0; i<10; i++) { //
A[i] = i;
}
.
输出样例1:
NO
/-?
感觉没什么问题 但就是结果不对
#include
#include
#define Max 100
#define ERROR NULL
#define YES 1
#define NO 0
void Lack_left( char a ) // 缺少左符号时的输出
{
if (a == '>')
printf("NO\n?-*/");
else
printf("NO\n?-%c", a);
exit(0);
}
void Lack_right( char a ) // 缺少右符号时的输出
{
if (a == '<')
printf("NO\n/*-?");
else
printf("NO\n%c-?", a);
exit(0);
}
typedef char element;
typedef struct LNode
{
element *data;
int top;
int size;
}LNode,*list;
list create(int size)
{
list S=(list)malloc(sizeof(struct LNode));
S->data=(list)malloc(sizeof(struct LNode));
S->top=-1;
S->size=size;
return S;
}
int isfull(list S)
{
if(S->top==S->size-1)
{
return YES;}
return NO;
}
int isempty(list S)
{
if(S->top==-1)
{
return YES;
}
return NO;
}
int push(list S,element X)
{
if(isfull(S))
{
return YES;
}else
{
S->data[++S->top]=X;
return NO;
}
}
void pop(list S)
{
if(!isempty(S))
{
return ERROR;
}else
{
S->data[S->top]='\0';
S->top--;
}
}
int main()
{
list S=create(100);
char str[Max];
char t[Max];
int l=-1;
while (scanf("%s", str) != EOF && str[0] != '.') // 先对输入文本进行处理,将所有符号压入到符号栈中
{
for (int i = 0; str[i] != '\0'; i++)
{
if (str[i] == '(' || str[i] == ')' || str[i] == '[' || str[i] == ']' || str[i] == '{' || str[i] == '}')
t[++l] = str[i];
else if (str[i] == '/' && str[i + 1] == '*')
{
t[++l] = '<';
i++;
}
else if (str[i] == '*' && str[i + 1] == '/')
{
t[++l] = '>';
i++;
}
}
}
for(int i=0;t[i]!='\0';i++)
{
if(t[i] == '(' || t[i] == '[' || t[i] == '<' || t[i] == '{')
{
push(S,t[i]);
}else if(t[i]==')')
{
if(S->data[S->top]=='(')
{
pop(S);
}else
{
if (S->top == -1)
Lack_left( t[i] );
else
Lack_right( S->data[S->top] );}
}else if(t[i]==']')
{
if(S->data[S->top]=='[')
{
pop(S);
} else
{
if (S->top == -1)
Lack_left( t[i] );
else
Lack_right( S->data[S->top] );}
}else if(t[i]=='}')
{
if(S->data[S->top]=='{')
{
pop(S);
}else
{
if (S->top == -1)
Lack_left( t[i] );
else
Lack_right( S->data[S->top] );}
}else if(t[i]=='>')
{
if(S->data[S->top]=='<')
{
pop(S);
}else
{
if (S->top == -1)
Lack_left( t[i] );
else
Lack_right( S->data[S->top] );}
}
}
if(S->top==-1)
{
printf("YES");
}else
{
Lack_right( S->data[0] );
}
return 0;
}
无论我输入什么,结果都是相同的内容