西北工业大学noj数据结构表达式括号匹配(严3.19)

西北工业大学noj数据结构表达式括号匹配(严3.19)_第1张图片
在这里插入图片描述
这道题要求我们判断输出的一个字符串中的括号是否符合运算规律。可以运用栈的思想。如果一个括号是左括号就入栈,如果输出一个右括号就将它和栈头的左括号对比,符合就出栈(相当于消掉)。最后如果还有没消掉的括号就是不符合规定。
话不多说上代码:

#include
#include
#include
#define max 1000
#define ok 1
#define error 0
typedef struct
{
    char a[max];
    int top;
}seq;
void InitStack(seq *s)//初始化
{
    s->top=-1;
}
int Push(seq*s,char x)//元素入栈
{
    if(s->top==max-1) return (error);
    s->top++;
    s->a[s->top]=x;
    return (ok);
}
int Pop(seq *s,char* x)//元素出栈
{
    if(s->top==-1) return(error);
    else
        {
          *x=s->a[s->top] ;
          s->top--;
          return(ok);
        }
}
int GetTop(seq*s,char*x)//将栈顶元素读取到x中
{
    if(s->top==-1) return (error);
    else
        {
            *x=s->a[s->top];
    return (ok);
        }
}
int Match(char a,char b)//检测两个括号是否匹配
{
    if((a=='('&&b==')')||(a=='['&&b==']')||(a=='{'&&b=='}')) return (ok);
    else return 0;
}
int IsEmpty(seq *s)//检测栈是否为空
{
    if(s->top==-1) return (ok);
    else return(error);
}
void BracketMatch(char *str)
{
    seq s;int i;char ch;
    InitStack(&s);
    for(i=0;str[i]!='\0';i++)
    {
        switch(str[i])
        {
        case'(':
        case'[':
        case'{':
            Push(&s,str[i]);break;//如果是前括号,就入栈
        case')':
        case']':
        case'}':
            if(IsEmpty(&s)) {printf("no");return;}//空表no右括号多余
            else
            {
                GetTop(&s,&ch);
                if(Match(ch,str[i]))  Pop(&s,&ch);//匹配的括号消掉
                else{printf("no");return;}//括号不同类
            }
        }
    }
    if(IsEmpty(&s)) printf("yes");
    else  printf("no");//左括号多余
}
int main()
{
    char str[max];
    scanf("%s",str);
    BracketMatch(str);
    return 0;
}

你可能感兴趣的:(数据结构,数据结构,栈,算法,c语言,程序人生)