7-22 符号配对
分数 15
作者 DS课程组
单位 浙江大学
请编写程序检查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
鸣谢用户 王渊博 补充数据!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string symbolRepository; // 存储括号
while (true)
{
string tempStr;
getline(cin, tempStr);
if (tempStr == ".") // 如果是“.”就结束输入
break;
for (size_t i = 0; i < tempStr.size(); i++)
{
if (tempStr[i] == '(' || tempStr[i] == '{' || tempStr[i] == '[' || tempStr[i] == ')' || tempStr[i] == '}' || tempStr[i] == ']') // 单符号的插入
{
symbolRepository.push_back(tempStr[i]);
}
else if (tempStr[i] == '/' && tempStr[i + 1] == '*')
{
symbolRepository.push_back('<');
i++;
}
else if (tempStr[i] == '*' && tempStr[i + 1] == '/')
{
symbolRepository.push_back('>');
i++;
}
}
}
// 开始检测符号匹配
stack<char> symbolBag; // 储存匹配括号
unordered_map<char, char> symbolParter{
{'(', ')'}, {'[', ']'}, {'{', '}'}, {'<', '>'}};
for (char c : symbolRepository)
{
// 如果是左括号
if (symbolParter.count(c))
{
symbolBag.push(c);
}
else // 如果是右括号
{
if (symbolBag.empty()) // 如果为空,说明左括号错误
{
cout << "NO\n";
if (c == '>')
cout << "?-*/";
else
cout << "?-" << c << "\n";
return 0; // 记得结束,不然最后还会输出一遍
}
else if (symbolParter[symbolBag.top()] == c) // 配对成功
{
symbolBag.pop();
}
else // 配对不成功
{
cout << "NO\n";
if (symbolBag.top() == '<')
{
cout << "/*-?";
}
else
{
cout << symbolBag.top() << "-?";
}
return 0; // 记得结束,不然后面会再输出一遍
}
}
}
//
if (symbolBag.empty()) // 所有括号匹配成功
cout << "YES";
else
{
cout << "NO\n";
if (symbolBag.top() == '<')
{
cout << "/*-?";
}
else
{
cout << symbolBag.top() << "-?";
}
}
return 0;
}
-
注意
map类型的初始化方式unordered_map<char, char> symbolParter{ {'(', ')'}, {'[', ']'}, {'{', '}'}, {'<', '>'}};
6499

被折叠的 条评论
为什么被折叠?



