7-51 符号配对 (20 分)【满分】

7-51 符号配对 (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>
#define maxsize 1003
#include<stdlib.h>
typedef struct node *stack;
struct node{
	char ch[maxsize];
	int top;
};
stack creat()
{
	stack s;
	s=(stack)malloc(sizeof(struct node));
	s->top=-1;
	return s;	
} 
void push(stack s,char cht)
{
	s->top++;
	s->ch[s->top]=cht;	
} 

int main()
{
	int i,k=0,j;
	static char ch1[1000],ch2[1000],ch[10000];
	struct node *s1=NULL;
	s1=creat();
	ch1['(']=')';
	ch1['{']='}';
	ch1['[']=']';
	//'*/'用'>'来代替; 
	//'/*'用'<'来代替; 
	ch1['<']='>';
	for(i=0;;i++)
	{
		gets(ch);
		if(ch[0]=='.'&&ch[1]=='\0') break;
		for(j=0;ch[j]!='\0';j++)
		{
			if(ch[j]=='('||ch[j]==')'||ch[j]=='['||ch[j]==']'||ch[j]=='{'||ch[j]=='}')
			{
				ch2[k++]=ch[j];
			}
			else if(ch[j]=='/'&&ch[j+1]=='*')
			{
				ch2[k++]='<';
				j++;
			}
			else if(ch[j]=='*'&&ch[j+1]=='/')
			{
				ch2[k++]='>';
				j++;
			}
		}
	}
	int flag=1;
	for(i=0;i<k;i++)
	{
		if(ch2[i]=='('||ch2[i]=='['||ch2[i]=='{'||ch2[i]=='<')
		{
			push(s1,ch2[i]);
		}
		else if(ch2[i]==')'||ch2[i]==']'||ch2[i]=='}'||ch2[i]=='>')
		{
			if(s1->top!=-1&&ch1[s1->ch[s1->top]]==ch2[i])
			{
				s1->top--;
			}
			else 
			{
				printf("NO\n");
				//缺左边的符号; 
				if(s1->top==-1)
				{
					if(ch2[i]==')') printf("?-)");
					else if(ch2[i]=='}') printf("?-}");
					else if(ch2[i]==']') printf("?-]");
					else if(ch2[i]=='>') printf("?-*/"); 
				}
				//缺右边的符号; 
				else if(ch1[s1->ch[s1->top]]!=ch2[i])
				{
					if(s1->ch[s1->top]=='(') printf("(-?");
					else if(s1->ch[s1->top]=='[') printf("[-?");
					else if(s1->ch[s1->top]=='{') printf("{-?");
					else if(s1->ch[s1->top]=='<') printf("/*-?");
				}
				flag=0;
				break;
			}
		}
	}
    //切记,当输出YES时,堆栈一定为空;
	if(flag==1&&s1->top==-1) printf("YES");
    //当输入字符串为"[[[]"时;
    //左边有多余左符号;
    else if(flag==1&&s1->top!=-1)
    {
        printf("NO\n");
        if(s1->ch[s1->top]=='(') printf("(-?");
		else if(s1->ch[s1->top]=='[') printf("[-?");
					else if(s1->ch[s1->top]=='{') printf("{-?");
					else if(s1->ch[s1->top]=='<') printf("/*-?");
    }
	return 0;
}

下面的代码有一个测试点过不去

#include<stdio.h>
int main()
{
	int i,k=0,a1=0,b1=0,c1=0,d1=0,a2=0,b2=0,c2=0,d2=0,j,flag1=0,flag2=0,flag3=0,flag4=0;
	static char ch[1000][1000];
	for(i=0;;i++)
	{
		gets(ch[i]);//用gets输入字符串;输入的'\n'会自动转换成'\0'; 
		if(ch[i][0]= ='.'&&ch[i][1]= ='\0') break;
		k++;
	}
	for(i=0;i<k;i++)
	{
		for(j=0;ch[i][j]!='\0';j++)
		{
			if(ch[i][j]= ='(') a1++;
			else if(ch[i][j]= ='[') b1++;
			else if(ch[i][j]= ='{') c1++;
			//排除这种"/*/"情况; 
			else if(ch[i][j]= ='/'&&ch[i][j+1]= ='*'&&ch[i][j+2]!='/'&&ch[i][j+1]!='\0') d1++;
			else if(ch[i][j]= =')') a2++;
			else if(ch[i][j]= =']') b2++;
			else if(ch[i][j]= ='}') c2++;
			//排除这种情况"/*/"; 
			else if(ch[i][j]= =' * '&&ch[i][j+1]= ='/'&&ch[i][j+2]!='/'&&ch[i][j+1]!='\0') d2++; 
		}
	 }
	 if(a1= =a2) flag1=1;
	 if(b1= =b2) flag2=1;
	 if(c1= =c2) flag3=1;
	 if(d1= =d2) flag4=1;
	 if(flag1&&flag2&&flag3&&flag4) printf("YES");
	 else //测试点5,输出第一个不匹配的符号;
	 {
	 	printf("NO\n");
	 	if(flag1= =0)
	 	{
	 		if(a1>a2) printf("(-?");
			else printf("?-)"); 	
		}
		else if(flag2= =0)
		{
			if(b1>b2) printf("[-?");
			else printf("?-]");
		}
		else if(flag3= =0)
		{
			if(c1>c2) printf("{-?");
			else printf("?-}");
		}
		else if(flag4==0)
		{
			if(d1>d2) printf("/*-?");
			else printf("?-*/"); 
		}
  }
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值