题目链接:
https://ac.nowcoder.com/acm/contest/3005/B
题面;
思路:
这道题目考察的其实就是一个灵活使用栈这个知识点,我们这里基本的思路就是一旦找到相邻的两个括号匹配,消除匹配了的括号,然后在继续判断下面的括号是不是一一匹配,而我代码的思路基本就是先把左括号一个个压入栈,然后一旦遇到右括号就直接访问栈头判断与不与之对应,如果不与之对应,那么就证明无法找到匹配的括号了,就标记直接跳出循环,如果找到匹配的括号,那么我就选择删除已经匹配了的栈头,接着继续循环,最后判断栈里面的元素是否为空,如果为空就证明了所有的左括号的一一对应了,因为之前一旦右括号有不对应的就已经标记了,所有后面我们就判断是不是为空,如果为空就是证明是全部为匹配的括号,如果不为空就证明还有没有匹配的括号。基本思路就是这样
参考代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int len,flag=1;
char a[10000000];
cin >> a;
len = strlen(a);
stack<char>s;
for (int i = 0; i < len ; i++)
{
if (a[i] == '(' || a[i] == '{' || a[i] == '[')//如果括号为左括号就压入栈
s.push(a[i]);
else if (a[i] == ')' || a[i] == '}' || a[i] == ']')//如果为右括号就开始判断是否存在对应的左括号
{
if (s.empty())//如果栈此时为空就证明没有对应的左括号与之对应,所以就标记输出no并且跳出循环
{
cout << "No";
flag = 0;
break;
}
else if ((a[i] == ']' && s.top() == '[') || (a[i] == '}' && s.top() == '{') || (a[i] == ')' && s.top() == '('))//如果栈头有与之对应的左括号,那么就删除栈头,消除这一成功匹配的括号
{
s.pop();
}
else//其他情况也不存在对应的括号
{
cout << "No";
flag = 0;
break;
}
}
}
if (flag == 1)//如果从来没有被标记过
{
if (s.empty())//如果此栈正好为空就证明所以左括号都有与之对应的右括号就证明这整个字符串的序列都有一一对应的括号
cout << "Yes";
else//如果不为空就证明存在无对应的括号
cout << "No";
}
}