1. 程式人生 > 其它 >1355:字串匹配問題(strs)

1355:字串匹配問題(strs)

【題目描述】

字串中只含有括號(),[],<>,{},判斷輸入的字串中括號是否匹配。如果括號有互相包含的形式,從內到外必須是<>,(),[],{},例如。輸入:[()]輸出:YES,而輸入([]),([)]都應該輸出NO

【輸入】

第一行為一個整數nn,表示以下有多少個由括好組成的字串。接下來的nn行,每行都是一個由括號組成的長度不超過255255的字串。

【輸出】

在輸出檔案中有nn行,每行都是YESNO

【輸入樣例】

5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]

【輸出樣例】

YES
YES
YES
YES
NO

#include <iostream>
using namespace std;

const int N = 255;
char a[N] = {0};

int main()
{
    int n;
    cin >> n;
    char ch = cin.get();//return char
    //cout<<n<<":"<<ch<<endl;
    for (int i = 0; i < n; i++) {
        int jian, xiao, zhong, da, top, cnt;
        for (ch = jian = xiao = zhong = da = top = cnt = 0;
             ch != '@' && cnt < N; cnt++) {//從內到外必須是<>,(),[],{}
            //cin>>ch;//none space
            ch = cin.get();
            //cout<<ch;
            switch (ch) {
                case '<':
                    a[top++] = ch;
                    jian++;
                    break;
                case '>':
                    jian--; //尖括號
                    if (a[--top] != '<') {
                        //cout<<">:"<<a[top]<<endl;
                        cin >> a; //remove a line
                        ch = cin.get();//return char
                        ch = '@';
                    }
                    break;
                case '(':
                    a[top++] = ch;
                    xiao++;
                    break;
                case ')':
                    xiao--; //小括號
                    if (a[--top] != '(' || jian != 0) {
                        //cout<<"):"<<a[top]<<endl;
                        cin >> a; //remove a line
                        ch = cin.get();//return char
                        ch = '@';
                    }
                    break;
                case '[':
                    a[top++] = ch;
                    zhong++;
                    break;
                case ']':
                    zhong--; //中括號
                    if (a[--top] != '[' || jian != 0 || xiao != 0) {
                        //cout<<"]:"<<a[top]<<endl;
                        cin >> a; //remove a line
                        ch = cin.get();//return char
                        ch = '@';
                    }
                    break;
                case '{':
                    a[top++] = ch;
                    da++;
                    break;
                case '}':
                    da--; //大括號
                    if (a[--top] != '{' || jian != 0 || xiao != 0 || zhong != 0) {
                        //cout<<"}:"<<a[top]<<endl;
                        cin >> a; //remove a line
                        ch = cin.get();//return char
                        ch = '@';
                    }
                    break;
                case '@':
                default:
                    //cout<<"@:"<<ch<<endl;
                    ch = '@';
                    break;
            }
        }
        //cout<<i<<":"<<ch<<endl;
        if (jian == 0 && xiao == 0 && zhong == 0 && da == 0) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
    }
    return 0;
}