题目
请编写程序检查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
鸣谢用户 王渊博 补充数据!
思路
/*
符号配对,很典型的堆栈题,利用堆栈的特性先进后出和代码中符号配对的性质是相同的,
注意点:
1.在于/* 和*/需要把它们当作一个整体字符,所以可以用<和>来分别代替,
2.在于样例1中,对于/*/的判断,要多一次i++,相当于从第一个’/'直接跳到了第二个’/‘
3.最后的输出,在flag=1时,注意栈是否为空的情况,如果栈不为空,就输出top的元素,右符号缺失;如果栈为空,就输出之前的t,左符号缺失;
*/
代码
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 105
typedef struct StackRecord *Stack;
struct StackRecord {
int Top;
char *Array;
};
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;
}
void push(Stack s, char x){
s->Array[++(s->Top)] = x;
}
void pop(Stack s){
s->Top--;
}
char top(Stack s){
return s->Array[s->Top];
}
char a[100];
char str[200];
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;
}