题目
请编写程序检查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<stack>
#include<string>
using namespace std;
int main(){
stack<string> ip;
string str;
while(1){
getline(cin,str);
if(str[0] == '.') break;
for(int i = 0;str[i]!='\0';++i){
if(str[i]=='{') ip.push("{");//左符号压栈
else if(str[i]=='[') ip.push("[");
else if(str[i]=='(') ip.push("(");
else if(str[i]=='/' && str[++i] == '*') ip.push("/*");
else if(str[i]=='*'&& str[++i] == '/'){
if(!ip.empty()&&ip.top()=="/*") ip.pop();//右符号匹配则出栈
else{
if(ip.empty()) cout <<"NO"<<endl<<"?-*/"<<endl;//栈空,左符号不匹配
else cout << "NO"<<endl<<ip.top()<<"-?"<<endl;//栈不空,右符号不匹配
return 0;
}
}
else if(str[i]==')'){
if(!ip.empty()&&ip.top()=="(") ip.pop();
else{
if(ip.empty()) cout << "NO"<<endl<<"?-)"<<endl;
else cout <<"NO"<<endl<<ip.top()<<"-?"<<endl;
return 0;
}
}
else if(str[i]==']'){
if(!ip.empty()&&ip.top()=="[") ip.pop();
else{
if(ip.empty()) cout << "NO"<<endl<<"?-]"<<endl;
else cout <<"NO"<<endl<<ip.top()<<"-?"<<endl;
return 0;
}
}
else if(str[i]=='}'){
if(!ip.empty()&&ip.top()=="{") ip.pop();
else{
if(ip.empty()) cout << "NO"<<endl<<"?-}"<<endl;
else cout <<"NO"<<endl<<ip.top()<<"-?"<<endl;
return 0;
}
}
}
}
if(ip.empty()) cout <<"YES"<<endl;//所有符号均匹配
else cout << "NO"<<endl<<ip.top()<<"-?"<<endl;//剩余左符号未匹配
return 0;
}