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

NYOJ 2題------括號配對問題

括號配對問題

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

難度:3

描述

現在,有一行括號序列,請你檢查這行括號是否配對。

輸入

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

輸出

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

樣例輸入

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

樣例輸出

No
No
Yes

來源

網路

上傳者

naonao

題目連結:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=2

分析在程式碼中註解

程式碼:

#include <iostream>
#include <stack>        //棧的標頭檔案
#include<cstring>       //用到strlen要加這個標頭檔案
using namespace std;
int main()
{
    int n,i,t,j;
    char a[10010];
    cin>>n;
    stack <char> s;     //定義棧堆s,其元素型別是字元型
    for(j=0;j<n;j++)
    {
        cin>>a;     
        t=strlen(a);
        bool flag=true;     //定義一個布林型變數flag並初始化為真(true)
        while(s.empty()!=true)      //清空棧,一直出棧直至棧空
        {
            s.pop();
        }
        i=0;
        while (i<t)
        {
            if(a[i]=='['||a[i]=='(')        //遇見'['和'('時,使其進棧
                s.push(a[i]);
            if(a[i]==']')               
            {
                if(!s.empty()&&s.top()=='[')    //如果a[i]時']'時,判斷棧是否為空,並且棧頂元素是否為'['
                {
                        s.pop();           //如果條件成立,則使棧頂元素出棧
                }
                else                       //反之,則flag=false
                    flag=false;

            }
            if(a[i]==')')
            {
                if(!s.empty()&&s.top()=='(')        //原理同上
                {
                        s.pop();
                }
                else
                    flag=false;

            }
            i++;

        }
        if(flag==true&&t%2==0)             //如果flag為真(true)並且必須輸入的括號長度是偶數,否則必定不匹配(這是防止輸入一個'['或者'('時出現錯誤)
                                                                                                                                        
        {
            cout<<"Yes"<<endl;
        }
        else                              
        {
            cout<<"No"<<endl;
        }
    }



}