符号配对

符号配对 (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<iostream>
#include<cstring>
#include<string>
#include<map>

using namespace std;

int main(){
	int i=0,j=0,k=0;
	int len;
	char ins[101];
	char a[101],b[101];
	map<char,char> sign;
	sign['(']=')';
	sign['{']='}';
	sign['[']=']';
	sign['<']='>';
	int flag=1;
	while(1){
		cin.getline(ins,101);
		if(strcmp(ins,".")==0){
			break;
		}
		len = strlen(ins);
		for(i=0;i<len;i++){
			if(ins[i]=='(' || ins[i]==')' || ins[i]=='[' || ins[i]==']' || ins[i]=='{' || ins[i]=='}'){
				a[j++]=ins[i];
			}else if(ins[i]=='/' && ins[i+1]=='*'){
				a[j++]='<';
				i++;
			}else if(ins[i]=='*' && ins[i+1]=='/'){
				a[j++]='>';
				i++;
			}
		}
	}
	for(i=0;i<j;i++){
		if(a[i]=='('||a[i]=='{'||a[i]=='['||a[i]=='<'){
			b[k++]=a[i];
		}else if(k>0 && sign[b[k-1]]==a[i]){
			//注意判断条件 
			k--;
		}else{
			flag=0;
			cout<<"NO"<<endl;
			if(k==0){
				if(a[i]=='>'){
					cout<<"?-*/";
				}else{
					cout<<"?-"<<a[i];
				}
			}else{
				if(b[k-1]=='<'){
					cout<<"/*-?";
				}else{
					cout<<b[k-1]<<"-?";
				}
			}
			break;
		}
	}
	if(flag==1){
		if(k==0){
			cout<<"YES"<<endl;
		}else{
			cout<<"NO"<<endl;
			if(b[k-1]=='<'){
				cout<<"/*-?";
			}else{
				cout<<b[k-1]<<"-?";
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ru_ruo1/article/details/86671968
今日推荐