7-2 符号配对 (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 <bits/stdc++.h>
using namespace std;
stack<char> st;
vector<char> v;
int main()
{
string s;
while(getline(cin,s))//一行一行读取,因为有空格
{
if(s==".")
break;
for(int i=0; i<s.size(); i++)
v.push_back(s[i]);
}
int flag = 1;//是否匹配成功
int left = 0;//左边缺
int right = 0;//右边缺
char x; //x是输出的不缺的一半括号
for(int i=0; i<v.size(); i++)//逐个判断
{
if(v[i]=='(')
{
st.push('(');
}
else if(v[i]=='[')
{
st.push('[');
}
else if(v[i]=='{')
{
st.push('{');
}
else if(v[i]=='/'&&v[i+1]=='*')//特判 /*,只存、/足矣
{
st.push('/');
i++;//跳过后续* ,因为可能会有/*/这种情况
}
//以下是判断右括号匹配
else if(v[i]=='*'&&v[i+1]=='/')
{
i++; //依然跳过
if(st.empty())//如果栈空,说明缺左括号
{
left=1;
x='/';
flag=0;
break;
}
if(st.top()=='/')//如果匹配,继续
{
st.pop();
continue;
}
else //不匹配,是缺少与之匹配的右括号
{
right = 1;
x=st.top();
flag=0;
break;
}
} //下面一个道理
else if(v[i]==')')
{
if(st.empty())
{
left=1;
x=')';
flag=0;
break;
}
if(st.top()=='(')
{
st.pop();
continue;
}
else
{
right = 1;
x=st.top();
flag=0;
break;
}
}
else if(v[i]==']')
{
if(st.empty())
{
left=1;
x=']';
flag=0;
break;
}
if(st.top()=='[')
{
st.pop();
continue;
}
else
{
right = 1;
x=st.top();
flag=0;
break;
}
}
else if(v[i]=='}')
{
if(st.empty())
{
left=1;
x='}';
flag=0;
break;
}
if(st.top()=='{')
{
st.pop();
continue;
}
else
{
right = 1;
x=st.top();
flag=0;
break;
}
}
}
if(!st.empty()&&flag==1)//可能右括号匹配完了,但是栈还不空,就是左括号多了,
{
//这时失配的是栈顶括号
right=1;
flag=0;
x=st.top();
}
if(flag)
cout<<"YES"<<endl;
else
{
printf("NO\n");
if(left)
{
if(x=='/')//特判输出
{
printf("?-*/");
}
else
printf("?-%c",x);
}
else
{
if(x=='/')
printf("/*-?");
else
printf("%c-?",x);
}
}
return 0;
}