本题利用堆栈性质处理
1)初始设置一个空栈,顺序读入括号
顺序遍历得出的chars_str(存储括号的string)
2)若是右括号,判断栈是否为空,若为空则NO,若栈顶此时括号与此右括号不相匹配,则NO,匹配则弹栈
3)若是左括号,直接压栈
4)若遍历完整个chars_str,stack不为空,则为NO,能走到这一步,栈顶元素必为某左括号;若stack为空,则为YES
注意:
(1)本程序中间有多个返回点(return 0)
(2)要对第一个错误的括号输出相应的错误信息,是一个烦点,程序对此问题的处理有加以注释
#include<iostream>
#include<stack>
#include<string>
#include<vector>
using namespace std;
int main()
{
string chars_str="",cur_str;
vector<string>vec;
stack<char>my_stack;
while (true)
{
/*将每行分别读入string向量vec*/
getline(cin, cur_str);
if (cur_str == ".")break;
vec.push_back(cur_str);
}
for (int i = 0,j=0; i < vec.size(); i++,j=0)
{
/*将所有括号按序存入chars_str*/
// 将"*/"、"/*"分别替换为'>'、'<'
cur_str = vec[i];
while (j < cur_str.length())
{
if (cur_str[j] == '(' || cur_str[j] == ')' || cur_str[j] == '[' || cur_str[j] == ']'|| cur_str[j] == '{'|| cur_str[j] == '}')chars_str += cur_str[j++];
else if (cur_str[j] == '/' && j + 1 < cur_str.length() && cur_str[j + 1] == '*')
{
chars_str += '<';
j += 2;
}
else if (cur_str[j] == '*' && j + 1 < cur_str.length() && cur_str[j + 1] == '/')
{
chars_str += '>';
j += 2;
}
else j++;
}
}
for (int i = 0; i < chars_str.length(); i++)
{
char cur_char = chars_str[i],c;
if (cur_char == '{' || cur_char == '[' || cur_char == '(' || cur_char == '<')
{
my_stack.push(cur_char);
continue;
}
switch (cur_char)
{
case']':
if (!my_stack.empty() && my_stack.top() == '[') { my_stack.pop(); break; }
else if (my_stack.empty())
{
cout << "NO" << endl << "?-]";
return 0;
}
else
{//找到第一个错误括号
while (!my_stack.empty()&&my_stack.top() != '[')
{
c = my_stack.top();
my_stack.pop();
}
if (!my_stack.empty())
{
if(c=='<')cout << "NO" << endl <<"/*-?";
else cout << "NO" << endl << c << "-?";
}
return 0;
}
case')':
if (!my_stack.empty() && my_stack.top() == '(') { my_stack.pop(); break; }
else if (my_stack.empty())
{
cout << "NO" << endl << "?-)";
return 0;
}
else
{
while (!my_stack.empty() && my_stack.top() != '(')
{
c = my_stack.top();
my_stack.pop();
}
if (!my_stack.empty())
{
if (c == '<')cout << "NO" << endl << "/*-?";
else cout << "NO" << endl << c << "-?";
}
return 0;
}
case'}':
if (!my_stack.empty() && my_stack.top() == '{') { my_stack.pop(); break; }
else if (my_stack.empty())
{
cout << "NO" << endl << "?-}";
return 0;
}
else
{
while (!my_stack.empty() && my_stack.top() != '{')
{
c = my_stack.top();
my_stack.pop();
}
if (!my_stack.empty())
{
if (c == '<')cout << "NO" << endl << "/*-?";
else cout << "NO" << endl << c << "-?";
}
return 0;
}
case'>':
if (!my_stack.empty() && my_stack.top() == '<') { my_stack.pop(); break; }
else if (my_stack.empty())
{
cout << "NO" << endl << "?-*/";
return 0;
}
else
{
while (!my_stack.empty() && my_stack.top() != '<')
{
c = my_stack.top();
my_stack.pop();
}
if (!my_stack.empty())
{
if (c == '<')cout << "NO" << endl << "/*-?";
else cout << "NO" << endl << c << "-?";
}
return 0;
}
}
}
if (my_stack.empty())
{
cout << "YES";
return 0;
}
switch (my_stack.top())
{
case'[':cout <<"NO"<<endl<<"[-?"; break;
case'(':cout << "NO" << endl << "(-?"; break;
case'{':cout << "NO" << endl << "{-?"; break;
case'<':cout << "NO" << endl << "/*-?"; break;
}
return 0;
}