题目描述
查看题目信息
现在有多行括号序列,请你检查这行括号是否配对。
输入格式
第一行输入一个数N(0<N<=100),表示有N组测试数据。
后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串)。
数据保证S中只含有"[","]","(",")"四种字符。
输出格式
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No.
样例输入
3 [(]) (]) ([[]()])
样例输出
No No Yes
解题思路
一个后括号一定对应一个前括号且一层套一层,如果来了一个后括号没有前括号那就错误。
先进去的字符就会后出来,这种操作最好使用栈。
例1:
字符串为"([])"
它的出入栈步骤为
1.( …………左括号,无操作
2.([ …………左括号,无操作
3.( …………与左中括号配对成功将左中括号出栈
4. …………与左小括号配对成功将左小括号出栈
最后栈为空,成立。
例1:
字符串为"([])"
它的出入栈步骤为
1.( …………左括号,无操作
2.([ …………左括号,无操作
3.( …………与左中括号配对成功将左中括号出栈
4. …………与左小括号配对成功将左小括号出栈
最后栈为空,成立。
例2:
字符串为"([]"
它的出入栈步骤为
1.( …………左括号,无操作
2.([ …………左括号,无操作
3.( …………与左中括号配对成功将左中括号出栈
最后栈有字符,不成立。
例3:
字符串为"([)]"
它的出入栈步骤为
1.( …………左括号,无操作
2.([ …………左括号,无操作
3.([) …………右小括号无法配对左小括号,不成立
代码实现
#include<bits/stdc++.h>//此处用的头文件比较多
/*
#include<iostream>
#include<stack>
#include<string>
*/
using namespace std;
bool chk();//本人习惯
string str;//每次输入的字符串
int main(){
int n;
cin>>n;//输入字符串个数
while(n--){
cin>>str;//输入字符串
if(chk()) cout<<"Yes\n";//不用过多解释
else cout<<"No\n";
}
return 0;
}
bool chk(){ //为了让主函数整洁
if(str.size()%2) return 0; //如果可以配对那么字符串的长度是偶数
stack<char> s; //一个栈,用于判断//
for(int i=0;i<=str.size()-1;i++){ //遍历每一个字符
if(str[i]=='('||str[i]=='[') s.push(str[i]); //如果是左括号直接入栈
else if(str[i]==')'){//如果是右小括号,进行判断
if(s.empty()||s.top()!='(') return 0;//如果栈空或上面不是左小括号说明不成立
else s.pop();//否则为真,把左右小括号全部消除
}
else if(str[i]==']'){//与小括号同理
if(s.empty()||s.top()!='[') return 0;
else s.pop();
}
}
return s.empty(); //如果成立,那么栈应为空
}
样例测试
提交结果