给定仅包含“()[]{}”六种括号的字符串,请你判断该字符串中,括号的匹配是否是合法的,也就是对应括号的数量、嵌套顺序完全正确。。
输入格式:
第一行一个整数T(T<=10)
其后T行每行一个字符串只包含[{()}]六种字符(字符串长度2e5以内)
输出格式:
对于每个字符串,匹配输出Yes,否则输出No
输入样例:
输出样例:
思路
使用stack来存储符号,遇左压栈,如果为右括号判断是否与当前栈顶元素相匹配,若不匹配则为“No”,匹配则弹出当前栈顶元素(左括号),继续进行下一个括号匹配。最后为空栈则为“Yes”。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <iostream> #include <stack> using namespace std; bool com(char a, char b) { if ((a == '{' && b == '}') || (a == '[' && b == ']') || (a == '(' && b == ')')) return true; return false; } int main() { int n; cin >> n; getchar(); for (int i = 0; i < n; i++) { stack<char> s; string m; getline(cin, m); for (int j = 0; j < m.size(); j++) { char c = m[ j ]; if (!s.empty()) { if (com(s.top(), c)) { s.pop(); continue; } } s.push(c); } if (!s.empty()) cout << "No" << endl; else cout << "Yes" << endl; } }
|