現在,有一行括號序列,請你檢查這行括號是否配對。
輸入:
3 [(]) (]) ([[]()])輸出:
No
No
Yes
還要注意幾種特殊的組合 ]]]]()和[]]]
這個題用到數據結構中的棧,當然用stl裏#include<stack>現成的函數方便很多。
原理是:利用棧先進後出,後進先出的特點,當括號爲左括號時,把它放入棧用
push(),當不是左括號時,就用它與棧頂元素配對,即最後放進棧的左括號,若
配對就繼續,否則就可以輸出No了。中間有很多細節,詳見代碼註釋。
代碼:
#include<stdio.h>
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
char a[10000];
bool match(char a,char c) //判斷是否配對
{
if(a=='['&&c==']'||a=='('&&c==')')
return 1;
else
return 0;
}
void p(char *str)
{
stack<char> s; //建立一個棧
if(str[0]==']'||str[0]==')') //若一開始就是右括號就輸出並返回
{
printf("No\n");
return ;
}
for(int i=0; str[i]!='\0'; i++)
{
if(str[i]=='['||str[i]=='(') //如果是左括號就存入棧
{
s.push(str[i]);
continue;
}
if(s.empty()) //如果進來的是右括號,即棧內爲空,就是右括號多餘輸出NO
{
printf("No\n");
return;
}
else
{
if(match(s.top(),str[i])) //如果是右括號,並且配對,就把左括號踢出。
s.pop();
else
{
printf("No\n"); //如果不配對,就輸出No
return;
}
}
}
if(s.empty()) //如果最後棧內爲空,就配對
printf("Yes\n");
else
printf("No\n");
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",a);
p(a);
}
return 0;
}