括号配对问题(C++栈)
題目描述:
現(xiàn)在,有一行括號(hào)序列,請(qǐng)你檢查這行括號(hào)是否配對(duì)。
輸入描述:
第一行輸入一個(gè)數(shù)N(0<N<=100),表示有N組測(cè)試數(shù)據(jù)。后面的N行輸入多組輸入數(shù)據(jù),每組輸入數(shù)據(jù)都是一個(gè)字符串S(S的長(zhǎng)度小于10000,且S不是空串),測(cè)試數(shù)據(jù)組數(shù)少于5組。數(shù)據(jù)保證S中只含有"[", “]”, “(”, “)” 四種字符
輸出描述:
每組輸入數(shù)據(jù)的輸出占一行,如果該字符串中所含的括號(hào)是配對(duì)的,則輸出Yes,如果不配對(duì)則輸出No
樣例輸入:
3
[(])
(])
([])
樣例輸出:
No
No
Yes
思路分析:
對(duì)于括號(hào)匹配問(wèn)題,這里運(yùn)用C++的棧操作,比較方便。
定義一個(gè)變量y,用來(lái)判斷是否匹配成功,若成功,y=1,否則,y=0;最后根據(jù)y的值來(lái)輸出最后的結(jié)果。
定義一個(gè)字符數(shù)組s,存儲(chǔ)輸入的符號(hào)
定義一個(gè)變量l,為字符數(shù)組s的最大長(zhǎng)度
定義一個(gè)變量n,為需要判斷的組數(shù)
定義一個(gè)字符類型的棧sq,判斷是字符數(shù)組s里面的元素符號(hào)是否是‘(’,‘{’,‘[’,若是左半邊符號(hào),則入棧,
如不是,則跟已經(jīng)入棧的棧頂元素進(jìn)行匹配,
若匹配失敗,y=1,結(jié)束本次判斷;
若匹配成功,則將該元素符號(hào)出棧
最后組數(shù)循環(huán)完之后,判斷棧是否為空,是否全都匹配成功出棧了,若棧不為空,則y=1,匹配失敗。然后將棧中其他元素全部出棧。
代碼如下:
#include <iostream> #include<stack> #include<cstring> #include<cstdio> using namespace std;int main() {int n,i,l,y=0; //l為字符數(shù)組s的大小長(zhǎng)度;y=1表示匹配失敗,y=0表示匹配成功char s[65536]; //定義一個(gè)字符數(shù)組用來(lái)存待匹配的符號(hào)stack<char>sq; //定義一個(gè)char類型的棧scanf("%d",&n); //輸入要測(cè)試的幾組數(shù)據(jù)while(n--){y=0; //這里的y用來(lái)判斷是否為空棧cin>>s;l=strlen(s);for(i=0;i<l;i++){if(s[i]=='('||s[i]=='{'||s[i]=='[') //如果字符數(shù)組s里面的字符為左半邊符號(hào)sq.push(s[i]); //該字符數(shù)組s里面的符號(hào)進(jìn)棧else{if(sq.empty()) //如果棧為空{y=1; //y=1,直接說(shuō)明匹配不成功,因?yàn)楦緵]有進(jìn)左括號(hào)break;}}if(s[i]==']') //判斷字符數(shù)組里面的元素是否是 ] ,如果是進(jìn)入下一個(gè)判斷{if(sq.top()!='[') //判斷棧頂是否是 [{y=1; //若不是 [ y=1,匹配失敗break; //結(jié)束}else sq.pop(); //若是 [ 將棧頂元素出棧}if(s[i]=='}') //以次類推{if(sq.top()!='{'){y=1;break;}else sq.pop();}if(s[i]==')'){if(sq.top()!='('){y=1;break;}else sq.pop();}}if(!sq.empty()) //最后,如果棧不為空,則匹配失敗{y=1;}if(y==1) printf("No\n");else printf("Yes\n");while(!sq.empty()) //如果棧不空,棧頂元素出棧,直到棧為空為止{sq.pop();} }return 0;}總結(jié)
以上是生活随笔為你收集整理的括号配对问题(C++栈)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 颐和园适合上午去还是下午去
- 下一篇: 摩尔庄园百合花种子怎么获得