括號配對問題
時間限制: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;
}
}
}