7-2 符号配对
请编写程序检查C语言源程序中下列符号是否配对:/*
与*/
、(
与)
、[
与]
、{
与}
。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.
和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES
,否则输出NO
。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号
;如果缺少右符号,则输出左符号-?
。
输入样例1:
void test()
{
int i, A[10];
for (i=0; i<10; i++) { /*/
A[i] = i;
}
.
输出样例1:
NO
/*-?
题解
这道题输出格式中有一个重要点,若存在不匹配,指出第一个不配对的符号,所以,这道题咱们就需要用到栈了
首先,我们可以用一个字符串从输入的若干个串中筛选出题目需要检测的字符,考虑到只有
/*
和*/
是两个字符,我们可以,当检测到这对时,用 <
和>
存储,方便判断,之后用栈,将筛选获得的字符串中左侧push
进栈,并判断,嗯,这道题判断的挺多的。。。
#include<bits/stdc++.h>
using namespace std;
int main()
{
stack<char> C;
string ss;
string s = ""; // 存放输入中需要检测的字符
while(true)
{
getline(cin, ss);
if(ss == ".")
break;
for(int i = 0; i < ss.length(); i++)
{
if(ss[i] == '['|| ss[i] == '{'||ss[i] == '('||ss[i] == ']'||ss[i] == '}'||ss[i] == ')')
s += ss[i];
else if(ss[i] == '/' && ss[i+1] == '*')
{
s += '<';
i++;
}
else if(ss[i] == '*' && ss[i+1] == '/')
{
s += '>';
i++;
}
}
}
for(int i = 0; i < s.length() ; i++)
{
if(s[i] == '<'||s[i] == '{'||s[i] == '('||s[i] == '[')
C.push(s[i]);
else if(C.empty())
{
if(s[i] == '}'||s[i] == ')'||s[i] == ']')
{
cout << "NO" << endl;
cout << "?-" << s[i] << endl;
return 0;
}
else if(s[i] == '>')
{
cout << "NO" << endl;
cout << "?-*/" << endl;
return 0;
}
}
else if(C.top() == '<')
{
if(s[i] == '>')
C.pop();
else
{
cout << "NO" << endl;
cout << "/*-?" << endl;
return 0;
}
}
else if(C.top() == '{')
{
if(s[i] == '}')
C.pop();
else
{
cout << "NO" << endl;
cout << C.top() << "-?" << endl;
return 0;
}
}
else if(C.top() == '(')
{
if(s[i] == ')')
C.pop();
else
{
cout << "NO" << endl;
cout << C.top() << "-?" << endl;
return 0;
}
}
else if(C.top() == '[')
{
if(s[i] == ']')
C.pop();
else
{
cout << "NO" << endl;
cout << C.top() << "-?" << endl;
return 0;
}
}
}
if(!C.empty())
{
if(C.top() == '<')
{
cout << "NO" << endl;
cout << "/*-?" << endl;
}
else
{
cout << "NO" << endl;
cout << C.top() << "-?" << endl;
}
}
else
cout << "YES" << endl;
return 0;
}