习题3.8 符号配对 (20 分)
请编写程序检查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
鸣谢用户 王渊博 补充数据!
#include <stdio.h>
char a[10000]; //核心思路:是建立一个堆栈来保存符号
char b[100]; //读入一个左边的便放进去,读入一个右边的先放进去
int main(){ //再pop出来一直到对应的左符号
int i=1,k=1,number=0;
a[0]='0';
while(1){
scanf("%c",&a[i]);//首先先读入字符
if(a[i]=='<'||a[i]=='>') a[i]='0';//防止/* 的符号的干扰
if(a[i-1]=='/'&&a[i]=='*') { //将 /*变成 '<' */变成 '>'
a[i-1]='<';a[i]='0';
}
if(a[i-1]=='*'&&a[i]=='/'){
a[i-1]='>';a[i]='0';
}
if(a[i-1]=='.'){
if(a[i]=='\n') break;
}
i++;
}
a[i]='\0';
for(i=1;a[i]!='\0';i++){
if(a[i]=='['||a[i]=='{'||a[i]=='('||a[i]=='<') {//如果左边直接放进去
b[k]=a[i]; k++;
}
if(a[i]==']'||a[i]=='}'||a[i]==')'||a[i]=='>'){ //如果是读到右边
b[k]=a[i];//先放进去,不放进去的话())类型的报错不会显示)符号
if(a[i]==']'){ //第一种类型
while (b[k]!='[') {if(k==0) {
printf("NO\n?-%c",a[i]);return 0;
}
k--;number++;}
if(number==1) number=0;//number用来记住中间间隔的符号有几个如果多了
// 说明中间有多余的左符号
else {if(b[k+1]=='<')printf("NO\n/*-?",b[k+1]);//注意将<要转变回去/*
else printf("NO\n%c-?",b[k+1]);return 0;
}
}
else if(a[i]==')'){//第二种类型
while (b[k]!='(') {if(k==0) {
printf("NO\n?-%c",a[i]);return 0;
}
k--;number++;}
if(number==1) number=0;
else {if(b[k+1]=='<')printf("NO\n/*-?",b[k+1]);
else printf("NO\n%c-?",b[k+1]);return 0;
}
}
else if(a[i]=='}'){//第三种类型
while (b[k]!='{') {if(k==0) {
printf("NO\n?-%c",a[i]);return 0;
}
k--;number++;}
if(number==1) number=0;
else {if(b[k+1]=='<')printf("NO\n/*-?",b[k+1]);
else printf("NO\n%c-?",b[k+1]);return 0;
}
}
else if(a[i]=='>'){//第四种类型
while (b[k]!='<') {if(k==0) {
printf("NO\n?-*/");return 0;
}
k--;number++;}
if(number==1) number=0;
else {if(b[k+1]=='<')printf("NO\n/*-?",b[k+1]);
else printf("NO\n%c-?",b[k+1]);return 0;
}
}
}
}
if(k>1) printf("NO\n%c-?",b[k]);//如果最后面所有都读完还没被清空堆栈,说明有多余左符号
else printf("YES");
return 0;}