#include<iostream>
#include<cstring>
#include<stack>//这是声明包含栈及其相关运算的头文件
using namespace std;
int main ()
{
int n;
cin>>n;
while(n--)
{
char s[10005];//声明字符串数组
cin>>s;
stack<char>stk; //定义一个栈,栈中的数据类型为字符类型
int flag=1;
int m=strlen(s);//计算出输入字符串的长度
for(int i=0;i<m;i++)//遍历
{
if(s[i]=='(' || s[i]=='[')//如果当前字符是左括号,则进栈
stk.push(s[i]);
if(stk.empty())//如果在遍历一遍之前栈已经为空,则说右括号多了,不符合条件,直接跳出循环
{
flag=0;
break;
}
else if(s[i]==')')//如果当前是右括号,则从栈中取出一个字符,查看是否匹配
{
if(stk.top()=='(')//如果能匹配,则将栈顶元素删除,进行下一个字符
{
stk.pop();
continue;
}
else//如果不匹配,则跳出循环
{
flag=0;
break;
}
}
else if(s[i]==']')
{
if(stk.top()=='[')
{
stk.pop();
continue;
}
else
{
flag=0;
break;
}
}
}
if(flag==0 || !stk.empty())//当遍历完成后,栈非空,说明多了左括号
cout<<"No"<<endl;
else if(flag==1 && stk.empty())
cout<<"Yes"<<endl;
}
return 0;
}
这个题目中用到了数据结构中栈的知识,在这里整理一下
用到的头文件为#include<stack>
定义一个栈为stack<数据类型>栈的名称
push(): 向栈内压入一个成员;
pop(): 从栈顶删除一个成员,不返回值;
empty(): 如果栈为空返回true,否则返回false;
top(): 返回栈顶,但不删除成员;
size(): 返回栈内元素的大小;