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;
}