栈和队列的应用(栈在括号匹配中的应用)

(((([]))))

1.根据括号的匹配可知最后一个出现的“左”括号最先被匹配(相当于栈的先进后出)

2.每次出现一个右括号,就消耗(出栈)一个左括号。

所以有遇到左括号就入栈,遇到右括号就消耗一个左括号

规则: 所有括号要都能两两配对(左括号与右括号)不能有单独的一个括号,其次必须一一对应如“(” 只能对应 “)”不能对应一个"]"

不匹配情况

对于此的逻辑有 :第一步:开始是否有未处理的括号如果没有判断栈是否为空,为空则匹配成功,若不空则匹配失败。

第二步:如果有未被处理的括号a,扫描a是否为左括号,如果为左括号则压入栈,如果不为左括号判断栈是否为空,若为空则匹配失败,若不为空则弹出栈顶元素b,判断b与a是否匹配,若匹配则匹配成功,否则匹配失败。

算法实现

首先定义一个栈

#define MaxSize 10  //定义一个栈中元素的最大·个数

typedef struct{

        char data[MaxSize-1];  //静态数组存放栈中元素

        int top;  //栈顶指针

}SqStack;

初始化栈

void InitStack(SqStack &s){

        s.top=-1;

}

判断栈是否为空

bool StackEmpty(SqStack s){

        if(s.top==-1) return true;

}

新元素入栈

bool push(SqStack &s,char x){

        if(s.top==MaxSize-1)

                return false;

      s.data[++s.top]=x;  //等价于 s.top=s.top+1 s.data[s.top]=x

       return true; 

}

栈顶元素出栈

bool pop(SqStack &s,ElemType &x ){

        if(s.top==-1) 

                return false;

        x=s.data[s.top--];

        return true;

}

具体实现

bool bracketCheck(char str[],int length){

        SqStack S;

         InitStack(S);//初始化栈

        for(i=0;i<length;i++){

                if (str[i]=='('||str[i]=='['||str[i]=='{'){

                        push(S,str[i]);

        }

                else{

                        if(StackEmpty(S))

                        return false;

                        char topElem;

                        pop(S,topElem);

                        if(topElem=='('&&str[i]!=')')

                                return false;

                        if(topElem=='['&&str[i]!=']')

                                return false;

                        if(topElem=='{'&&str[i]!='}')

                                return false;

}

}

return StackEmpty(s);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绞尽脑汁想个网名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值