现在,有一行括号序列,请你检查这行括号是否配对。
输入:
3 [(]) (]) ([[]()])输出:
No
No
Yes
还要注意几种特殊的组合 ]]]]()和[]]]
这个题用到数据结构中的栈,当然用stl里#include<stack>现成的函数方便很多。
原理是:利用栈先进后出,后进先出的特点,当括号为左括号时,把它放入栈用
push(),当不是左括号时,就用它与栈顶元素配对,即最后放进栈的左括号,若
配对就继续,否则就可以输出No了。中间有很多细节,详见代码注释。
代码:
#include<stdio.h>
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
char a[10000];
bool match(char a,char c) //判断是否配对
{
if(a=='['&&c==']'||a=='('&&c==')')
return 1;
else
return 0;
}
void p(char *str)
{
stack<char> s; //建立一个栈
if(str[0]==']'||str[0]==')') //若一开始就是右括号就输出并返回
{
printf("No\n");
return ;
}
for(int i=0; str[i]!='\0'; i++)
{
if(str[i]=='['||str[i]=='(') //如果是左括号就存入栈
{
s.push(str[i]);
continue;
}
if(s.empty()) //如果进来的是右括号,即栈内为空,就是右括号多余输出NO
{
printf("No\n");
return;
}
else
{
if(match(s.top(),str[i])) //如果是右括号,并且配对,就把左括号踢出。
s.pop();
else
{
printf("No\n"); //如果不配对,就输出No
return;
}
}
}
if(s.empty()) //如果最后栈内为空,就配对
printf("Yes\n");
else
printf("No\n");
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",a);
p(a);
}
return 0;
}