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

括號配對問題

wid -- highlight width image 結果 line ext 圖片

原題鏈接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=2

括號配對問題

時間限制:3000 ms | 內存限制:65535 KB 難度:3
描述
現在,有一行括號序列,請你檢查這行括號是否配對。
輸入
第一行輸入一個數N(0<N<=100),表示有N組測試數據。後面的N行輸入多組輸入數據,每組輸入數據都是一個字符串S(S的長度小於10000,且S不是空串),測試數據組數少於5組。數據保證S中只含有"[", "]", "(", ")" 四種字符
輸出
每組輸入數據的輸出占一行,如果該字符串中所含的括號是配對的,則輸出Yes,如果不配對則輸出No
樣例輸入
3
[(])
(])
([[]()])
樣例輸出
No
No
Yes
 1 #include<iostream>
 2 #include<string.h>
 3 using namespace std;
 4 
 5 char stack[10001];
 6 char s[10001];
 7 int main()
 8 {
 9     int n;
10     cin>>n;
11     while(n--)
12     {
13         int top=1,len;
14         cin>>s;
15         len=strlen(s);
16 stack[top]=s[0]; 17 top++; 18 for(int i=1;i<len;i++) 19 { 20 if(s[i]==[||s[i]==() 21 stack[top++]=s[i]; 22 else 23 { 24 if(stack[top-1]==[&&s[i]==]) 25 top--; 26
else if(stack[top-1]==(&&s[i]==)) 27 top--; 28 else 29 stack[top++]=s[i]; 30 } 31 } 32 if(top==1) 33 cout<<"Yes\n"; 34 else 35 cout<<"No\n"; 36 } 37 return 0; 38 }

思想:在表達式中,相同類型的括號(包括:()、[]、{})是成對出現的,並且當括號在表達式中嵌套時,不允許出現交叉現象。
檢驗括號匹配的方法,就是對給定的字符串依次檢驗:若是左括號,入棧;若是右括號,出棧一個左括號判斷是否與之匹配;是其他字符,不檢驗。檢驗到字符串尾,還要檢查棧是否為空。只有棧空,整個字符串才是括號匹配的。

AC結果:

技術分享圖片

運行結果:

技術分享圖片

括號配對問題