给出了一个长度为 n 的字符串,这个字符串仅包含 "{" 和 "}" 这两种括号。你需要根据给定的字符串来判断其括号是否匹配合理,如果合理则输出 YES,否则输出 NO。例如 {{{}}},{}{},{{}{}} 是合理的,而 {{}}},{}{{}{,{{{}{} 是不合理的。
输入描述:
第一行输入一个整数 (1≤t≤100),代表样例组数。 接下来 t 行,每行输入一个长度为 n(1≤n≤1000) 的字符串。
输出描述:
共 t 行,每行若字符串合理则输出 YES,否则输出 NO。 您可以在任何情况下打印每个字母无视大小写区分(例如,YES、Yes、yes、yEs 都将被识别为正确答案)。
输入
4 { {}} {}{}{{}} }{
输出
NO NO YES NO
经典的括号匹配类题,特点:单一对应,括号有先后之分 使用数据结构中的栈来解决是常见的思路
-
前提及思路
-
定义变量string s; stack<int>st; int mark=1;
-
先不输入s[i],先判断
-
保证栈内为空或只有'}'
-
mark记录特殊情况
-
-
过程判断
-
如果栈为空
-
如果s[i]为'}' mark=0
-
如果s[i]为'{' 输入'{'
-
-
如果栈不为空
-
如果s[i]为'}' 消去栈内一个'{'
-
如果s[i]为'{' 输入'{'
-
-
-
结果判断
-
栈为空 则为YES
-
栈不为空或者出现'}'时,'}'的左侧没有'{' 则为NO
以下为完整源代码
-
#include <iostream> #include <stack> using namespace std; int main(){ int t; cin>>t; while(t--){ int mark=1; string s; stack<int>st; cin>>s; for(int i=0;i<s.size();i++){ if(st.empty()) { if(s[i]=='}') { mark=0; break; } if(s[i]=='{') st.push(s[i]); } else if(!st.empty()) { if(s[i]=='}') st.pop(); if(s[i]=='{') st.push(s[i]); } } if(mark&&st.empty()) cout<<"YES"<<endl; if(!mark||!st.empty()) cout<<"NO"<<endl; } system("pause"); return 0; }