题目描述:
现在,有一行括号序列,请你检查这行括号是否配对
输入描述:
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")" 四种字符
输出描述:
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入:
3
[(])
(])
([[]()])
样例输出:
No
No
Yes
代码如下
#include <iostream>
#include <stack>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
int n;
cin >> n;
while (n--)
{
stack<char>Mikasa;//设置栈
char c[10010];//设置我们要输入的字符串
scanf("%s", c);//输入
int ko = 1;//设置标记
for (int i = 0; i < strlen(c); i++)//从零开始遍历
{
if (c[i] == '(' || c[i] == '[')//若为"("或者"[",就直接推入栈中
Mikasa.push(c[i]);
else
{
if(Mikasa.size() && c[i] == ')')//若为")",且栈不为空,就看栈顶有没有相应的"(",有的话就将(推出栈,否者退出遍历,直接将ko标记为0
{
if(Mikasa.top() == '(')
Mikasa.pop();
else
{
ko = 0;
break;
}
}
else if(Mikasa.size() && c[i] == ']')//类似
{
if(Mikasa.top() == '[')
Mikasa.pop();
else//如果栈为空的时候
{
ko = 0;
break;
}
}
else
{
ko = 0;
break;
}
}
}
if (Mikasa.size())//栈不为空就将ko标记为空
ko = 0;
if (ko == 0)
{
cout << "No" << endl;
}
else
{
cout << "Yes" << endl;
}
}
return 0;
}
这道题看着博客A出来的,感觉自己太菜了。不过也收获了栈的思想。