acm括号配对问题

acm括号配对问题

下边的文章会安装wp-code插件!

括号配对问题ACM

时间限制:3000 ms  | 内存限制:65535 KB
难度:3
       描述
      现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有”[“,”]”,”(“,”)”四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
[/cpp]3

[/cpp][(])

[/cpp](])

[/cpp]([[]()])

样例输出
[/cpp]No

[/cpp]No

[/cpp]Yes

#include <iostream>
#include <string>
using namespace std;
struct Stack
{
    char *stack;
    int top;
};
void init(Stack &S)
{
    S.stack=new char[10000];
    S.top=-1;
}
void Push(Stack &S,char &ch)
{
    S.top++;
    S.stack[S.top]=ch;
}
void Pop(Stack &S)
{
    S.top--;
}
int Peek(Stack &S)
{
    return S.stack[S.top];
}
int main()
{
    Stack S;string str;int x,d,i;cin>>d;
    while(d--)
    {
    init(S);
    cin>>str;x=0;
    for(i=0;i<str.size();i++)
    {
    switch(str[i])
    {
    case '[':
    case '(':Push(S,str[i]);break;
    case ']':if(Peek(S)=='[') Pop(S);else x=1;break;
    case ')':if(Peek(S)=='(') Pop(S);else x=1;break;
    }
    if(x==1) break;
    }
    if(S.top==-1&&x==0) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    delete[] S.stack;
    }
    return 0;
}