WXS的括号序列

wxs的括号序列

题目描述

美好的事物都是成对出现的,当然括号也是!WXS最近迷上了括号序列,但是这次的括号序列不同,它不仅仅有 '( '和 ')'还有 ‘{’ ‘}’。HJ说 如果每个左括号 都能和它右边的右括号匹配成功,那么它就是一个完美的括号序列。人尽皆知小括号是不能包住大括号的 ( ** ({}) 这样就是错的**).

分析: 这个题用栈就比较简单了。
#include"stdio.h"
#include"math.h"
void PUSH(char *stack,int *top,char c)//入栈
{
    (*top)++;
    *(stack+*top)=c;

}
char POP(char *stack,int *top)//压栈并返回栈顶的值
{
    char c=*(stack+*top);
    (*top)--;
    return c;
}
int main()
{
    char stack[10000],a[10000],cc;
    int i,top,t;
    while(~scanf("%s",&a[1]))//一个数组直接输入字符串
    {
        i=1;
        top=0;
        t=0;
        while(a[i]!='\0')
        {
            if(a[i]=='{'&&t==0)//等于’{‘,就入栈,且t==0.因为t如果不为0,则表示前面有’(‘。
                PUSH(stack,&top,a[i]);
            if(a[i]=='(')//小括号入栈,t可为任意值
            {
                PUSH(stack,&top,a[i]);
                t++;//t++记录有多少个这样的小括号’(‘
            }
            if(a[i]=='{'&&t!=0)//若为’{‘了,且t不等于0。则不满足条件直接退出 
            {
                
                break;
            }
            if(a[i]==')'&&t!=0)
            {
                cc=POP(stack,&top);
                if(!(cc=='('))
                    break;

                t--;
            }
            if(a[i]=='}'&&t==0)
            {
                cc=POP(stack,&top);
                if(!(cc=='{'))
                    break;
            }
            i++;
        }
        if(top==0)
            printf("YES\n");
        else
            printf("NO\n");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43506138/article/details/83758892
wxs
今日推荐