【问题描述】
一个合法的括号串,是指只包含括号的串,如果满足如下条件:
(1)<> () [] {} 这四对括号是合法的;
(2)如果r是合法括号串,则<r> (r) [r] {r}也是;
(3)如果r,s是合法括号串,则rs也是;
所以<<>> , [<>{}(())],[({<>})]是合法的括号串,而)(,[( ])就不是。
【输入形式】
输入第一行正整数t (10 ≤ n ≤ 100),表示有多少组测试数据。
后面有t行,每行一个只包含8种括号符号的括号串。
40%的括号串的长度L 2 ≤ L≤ 20;
30%的括号串的长度L 2 ≤ L≤ 200;
20%的括号串的长度L 2 ≤ L≤ 2000;
10%的括号串的长度L 2 ≤ L≤ 20000;
【输出形式】
对于每组测试数据,如果括号串是合法的,输出“Yes”(输出没有引号)占一行,否则,输出“No”(输出没有引号)占一行。
【样例输入】
6 <<>> )( [<>{}(())] [({<>})] [(]) <([{
【样例输出】
Yes No Yes Yes No No
【思路】
理解这几点:
1. 配对的括号,其值相差1或者2(可以由ASCII码得到)
2. 必须先判断栈是否空才能进行判断是否配对,否则会运行时错误
【AC代码】
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
stack<char> s;
string temp;
cin>>temp;
for(int i=0;i<temp.length() ;i++){ //直接判断当前要进栈的元素
if( (!s.empty() ) && (temp[i]==s.top() +1 || temp[i] == s.top() +2) ) s.pop();
else s.push(temp[i]) ;
}
if(!s.empty() ) cout<<"No"<<'\n';
else cout<<"Yes"<<'\n';
}
}
【写在后面】
对你有帮助记得点个赞哦~有啥问题请留言~