NYACM_002

来源:互联网 发布:手机apk反编译软件 编辑:程序博客网 时间:2024/06/13 09:19

题目:括号配对问题

输入

第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")" 四种字符

输出

每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No

链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=2

分析:同样比较简单,使用栈来处理即可,如果待入栈和栈顶不匹配,直接入栈,如果匹配,栈顶出站,最后栈为空说明匹配,否则不匹配。同时有些不匹配情况不需要判断所有输入,比如如果待判断括号个数不是偶数肯定不匹配,如果待处理的是]或者),此时栈顶不是对应的[或者(,也肯定不匹配。简而言之,输入如果是)/],前面一个必须是(/[,输入如果是(/[直接入栈即可。最后看栈是否为空。

AC code:

#include <iostream>
#include <stack>
using namespace std;

int Check(string str)
{
    int ret=0;
    if(str.size()%2 != 0)
    {
        return 0;  //奇数个肯定不匹配
    }
    stack<char> stk;
    for(int i=0;i<str.size();i++)
    {
        if(stk.size() == 0 )
        {
            //如果当前栈空,可以直接入栈或者返回0(先入栈的是右括号)
            if(str[i] == ')' || str[i] == ']' )
            {
                return 0;
            }
            else
            {
                stk.push(str[i]);
            }
        }
        else
        {
            //如果是左括号,直接入栈
            if(str[i] == '(' || str[i] == '[' )
            {
                stk.push(str[i]);
            }
            else
            {
                //看栈顶是否可以出栈
                if((str[i] == ']' && stk.top() == '[') || (str[i] == ')' && stk.top() == '('))
                {
                    stk.pop();
                }
                else
                {
                    return 0;
                }
            }
        }
    }
    if(stk.size() == 0)
    {
        ret=1;
    }
    else
    {
        ret=0;
    }
    return ret;
}
int main()
{
    int N; //
    string s;
    cin>>N;
    while(N--)
    {
        cin>>s;
        if(Check(s) == 1)
        {
            cout<<"Yes"<<endl;
        }
        else
        {
            cout<<"No"<<endl;
        }
    }
    return 0;
}


其他:可以将判断栈是否为空推迟到需要出栈的时候,即如果是左括号直接入栈,如果是右括号,判断如果栈非空且栈顶匹配,出栈,否则直接返回不匹配,不过时间内存没有变化。

#include <iostream>
#include <stack>
using namespace std;

int Check(string str)
{
    int ret=0;
    if(str.size()%2 != 0)
    {
        return 0;  //奇数个肯定不匹配
    }
    stack<char> stk;
    for(int i=0;i<str.size();i++)
    {
                //如果是左括号,直接入栈
            if(str[i] == '(' || str[i] == '[' )
            {
                stk.push(str[i]);
            }
            else
            {
                //看栈顶是否可以出栈
                if(stk.size()>0 && ((str[i] == ']' && stk.top() == '[') || (str[i] == ')' && stk.top() == '(')))
                {
                    stk.pop();
                }
                else
                {
                    return 0;
                }
            }
    }
    if(stk.size() == 0)
    {
        ret=1;
    }
    else
    {
        ret=0;
    }
    return ret;
}

int main()
{
    int N; //
    string s;
    cin>>N;
    while(N--)
    {
        cin>>s;
        if(Check(s) == 1)
        {
            cout<<"Yes"<<endl;
        }
        else
        {
            cout<<"No"<<endl;
        }
    }
    return 0;
}


原创粉丝点击