Description:
给定一串由()和[]组成的字符串。如果我们规定以下的字符串是合法的字符串:
(1) 空串是合法的字符串
(2) 如果A、B都是合法的,那么AB也是合法的字符串。
(3) 如果A是合法的,那么(A)和[A]都是合法的字符串。
也就是说,所有左右括号必须配对,且不能“切开括号”(如“[(])”或“([)]”)。
Input:
输入先是一个正整数n,代表有n个字符串。
接下来是n行字符串,每个字符串一行,注意,可能有空串。
Output:
对于每组数据,若是合法的字符串,则在单独的一行输出Yes,不然则出No。
Sample Input:
6
([])
(([()])))
([()])()
(([(])))
()[][()]
Sample Output:
Yes
No
Yes
No
Yes
Yes
题目链接
一道栈的入门题,因为有空串所以需要简单处理一下输入。
AC代码:
#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <cctype>
#include <cmath>
#include <stack>
#include <queue>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
int main() {
int n;
cin >> n;
cin.get();
for (int i = 0;i < n;++i) {
stack<char> s;
bool flag = 1;
string ch;
getline(cin,ch);
//cout << ch << endl;
int len = ch.length();
if (len == 0) {
cout << "Yes" << endl;
continue;
}
for (int j = 0;j < len;++j) {
if (ch[j] == '(' || ch[j] == '[') {
s.push(ch[j]);
}
else if (ch[j] == ')' || ch[j] == ']') {
if (s.size() == 0) {
flag = 0;
break;
}
if (ch[j] == ')' && s.top() == '(') {
s.pop();
}
else if (ch[j] == ']' && s.top() == '[' ) {
s.pop();
}
}
}
if (flag) {
if (s.size() == 0) {
cout << "Yes" << endl;
}
else {
cout << "No" << endl;
}
}
else {
cout << "No" << endl;
}
}
return 0;
}