NYOJ 2題------括號配對問題
阿新 • • 發佈:2018-11-25
括號配對問題
時間限制:3000 ms | 記憶體限制:65535 KB
難度:3
描述
現在,有一行括號序列,請你檢查這行括號是否配對。
輸入
第一行輸入一個數N(0<N<=100),表示有N組測試資料。後面的N行輸入多組輸入資料,每組輸入資料都是一個字串S(S的長度小於10000,且S不是空串),測試資料組數少於5組。資料保證S中只含有"[", "]", "(", ")" 四種字元
輸出
每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出Yes,如果不配對則輸出No
樣例輸入
3 [(]) (]) ([[]()])
樣例輸出
No No Yes
來源
上傳者
題目連結: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; } } }