nyoj 2 括號匹配
阿新 • • 發佈:2018-11-20
括號配對問題
時間限制:3000 ms | 記憶體限制:65535 KB
難度:3
輸入
第一行輸入一個數N(0<N<=100),表示有N組測試資料。後面的N行輸入多組輸入資料,每組輸入資料都是一個字串S(S的長度小於10000,且S不是空串),測試資料組數少於5組。資料保證S中只含有"[", "]", "(", ")" 四種字元
輸出
每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出Yes,如果不配對則輸出No
樣例輸入
3 [(]) (]) ([[]()])
樣例輸出
No No Yes
描述
現在,有一行括號序列,請你檢查這行括號是否配對。
基本思路:利用棧的知識將左括號入棧,碰到右括號則與棧頂元素配對,配對成功則繼續知道陣列迴圈到最後,則輸出Yes,當出現括號不匹配或棧空但陣列沒有迴圈完或陣列首元素為右括號的情況則輸出No。
#include <iostream> #include<stack> #include<string.h> #include<stdio.h> char t[11000]; using namespace std; int main() { int n,i; stack<char> s; scanf("%d",&n); while(n--) { while(!s.empty())//每次迴圈將棧清空 s.pop(); scanf("%s",t); for(i=0;i<strlen(t);i++) { if(t[i]=='['||t[i]=='(')//判斷是否為左括號,是則入棧 s.push(t[i]); else if(!s.empty())//否則首先判斷棧是否為空,這裡必須要判斷棧是否為空 //否則在棧空的情況下進行s.top()會出錯,我之前沒有ac就是沒有判斷總是出現執行錯誤。 { if((t[i]==']'&&s.top()=='[')||(t[i]==')'&&s.top()=='('))//如果是右括號則與棧頂元素配對,配對成功則棧頂元素出棧。 { s.pop(); } else break;//配對不成功則說明括號不匹配 跳出迴圈。 } else break;//這裡是為了判斷陣列首元素t[0]是否為右括號和棧空但陣列沒有迴圈完的情況。 } if(i==strlen(t)) printf("Yes\n"); else printf("No\n"); } return 0; }
下面是另一種AC的程式碼 大家可以看一下。只不過將一些情況單獨列了出來。
#include <iostream> #include<stack> #include<string.h> #include<stdio.h> char t[11000]; using namespace std; int main() { int n,i; stack<char> s; scanf("%d",&n); while(n--) { while(!s.empty()) s.pop(); scanf("%s",t); if(t[0]==')'||t[0]==']')//首先判斷陣列首元素是否為右括號 { printf("No\n"); continue; } else if(strlen(t)%2!=0)//如果陣列元素個數為奇數則跳過本次迴圈 { printf("No\n"); continue; } else { for(i=0;i<strlen(t);i++) { if(t[i]=='['||t[i]=='(') s.push(t[i]); else if(!s.empty()) { if((t[i]==']'&&s.top()=='[')||(t[i]==')'&&s.top()=='(')) { s.pop(); } else break; } } if(s.empty()==true)//最後棧空則表示配對完成,這裡的判斷和上面的程式碼的判斷條件略有不同大 //家注意意一下。 printf("Yes\n"); else printf("No\n"); } } return 0; }