关闭

NYOJ 2 括号配对问题 模拟栈【解析算法】

137人阅读 评论(0) 收藏 举报
分类:

括号配对问题

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

Yes

来源
网络
上传者
naonao

模拟栈
 
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct Sstack
{
    char sign[10010];
    int top;
};
void initstack(Sstack &s)
{
    s.top=-1;
}
bool isemptystack(Sstack &s)
{
    return s.top==-1?1:0;
}
int pushstack(Sstack &s,char c)
{
    s.sign[++s.top]=c;
    return 1;
}
int popstack(Sstack &s)
{  if(isemptystack(s))
   return 0;
    s.top--;
    return 1;

}
char topstack(Sstack &s)
{
    if(isemptystack(s))
    return 0;
    return s.sign[s.top];
}
int main()
{
    Sstack s;
    char a[10010];
    int n,i,bj,len;
    scanf("%d",&n);
    while(n--)
    {   bj=1;
        initstack(s);
        memset(a,0,sizeof(a));
        scanf("%s",a);
        len=strlen(a);
        for(i=0;i<len;i++)
        {
            if(a[i]=='['||a[i]=='(')
               pushstack(s,a[i]);
            else if(a[i]==']')
            {
                if(isemptystack(s)||topstack(s)!='[') bj=0;
                else popstack(s);
            }
            else if(a[i]==')')
            {
                if(isemptystack(s)||topstack(s)!='(') bj=0;
                else popstack(s);

            }
        }
        if(!isemptystack(s))
        bj=0;
        if(bj==1)
        printf("Yes\n");
        else
        printf("No\n");
    }
}
        



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27500次
    • 积分:1395
    • 等级:
    • 排名:千里之外
    • 原创:113篇
    • 转载:8篇
    • 译文:3篇
    • 评论:1条
    文章分类
    最新评论