习题3.8 符号配对 (20 分)(c语言堆栈)

该博客介绍了一道编程题目,旨在检查C语言源程序中的括号是否正确配对。程序需要处理四种类型的括号,并在输入结束时判断括号是否全部匹配。输出包括配对状态和第一个不匹配的括号类型。提供了输入和输出样例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

习题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;}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值