1. 程式人生 > >NYOJ 括號配對問題

NYOJ 括號配對問題

時間限制:3000 ms  |  記憶體限制:65535 KB

難度:3

輸入

第一行輸入一個數N(0<N<=100),表示有N組測試資料。後面的N行輸入多組輸入資料,每組輸入資料都是一個字串S(S的長度小於10000,且S不是空串),測試資料組數少於5組。資料保證S中只含有"[", "]", "(", ")" 四種字元

輸出

每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出Yes,如果不配對則輸出No

樣例輸入

3
[(])
(])
([[]()])

樣例輸出

No
No
Yes

#include <iostream>
#include <cstdio>
#include <vector>
#include <string>

using namespace std;

int main(int argc, char const *argv[]) {
    //N組資料
    int N;

    scanf("%d",&N);
    //用於儲存每一組的答案
    vector<string> q;

    //迴圈N組
    for(int i = 0;i < N;i++){
        string str;
        cin >> str;

        string::iterator front = str.begin();
        while(front != str.end()){
            //標誌
            int w = 0;
            //ASCALL碼 '(' => 40   ')' => 41  '[' => 91  ']' => 93
            if(*front + 1 == *(front + 1) || *front + 2 == *(front + 1)){
                // cout << *front << " " << *(front+1) << "\n" ;
                //刪除配對的一組
                str.erase(front,front + 2);
                //標誌刪除後
                w = 1;
            }
            //刪除後從頭開始 重新遍歷
            if(w == 1)front = str.begin();
            //否則繼續遍歷
            else front++;
        }
        //當全都刪除後代表 都能配對成功
        if(str.empty())q.push_back("Yes");
        else q.push_back("No");
    }

    for(vector<string>::iterator i = q.begin();i != q.end();i++)
        cout << *i << endl;
    return 0;
}