利用栈的相关知识检验括号是否匹配

栈的相关特点相信大家都知道,那么我们如何利用它来检验括号是否匹配呢。

主要思路如下:

1.扫描整个表达式;
2.判断当前字符是否为括号(左右括号)
①如果不是,则继续扫描下一个字符;
②如果是,则判断当前字符是否为左括号,若为左括号—>直接入栈,若为右括号,看栈顶的左括号是否与之匹配,如果匹配,则把该左括号出栈,并继续扫描下一个字符,如果不匹配,则直接标记并退出循环,无需再扫描了。

3.最后

a.带了标记—–>说明不匹配。

b.没带标记但栈不为空—–>说明左括号多于右括号。
c.没带标记且栈为空—–>说明括号匹配成功。

接下来,我们利用这个来做两道题:

例1:

 

#include<stdio.h>
#include<string.h>
char a[150],b[150];
int main()
{
    int n=0;
    scanf("%d",&n);
    getchar();
    for(int i=0; i<n; i++)
    {
        int flag=0,top=0;
        gets(a);//输入为空时也能处理
        int l=strlen(a);
        if(l==0)
        {
            printf("Yes\n");
            continue;
        }
        for(int j=0; j<l; j++)
        {
            if(a[j]=='('||a[j]=='[')
            {
                top++;
                b[top]=a[j];
            }
            else
            {
                if((b[top]=='('&&a[j]==')')||(b[top]=='['&&a[j]==']'))
                {
                    top--;//匹配消去一个左括号
                }
                else
                {
                    flag=1;//不匹配
                    break;
                }

            }
        }
        if(flag==1)
        {
            printf("No\n");
            continue;
        }
        if(top==0&&flag==0)printf("Yes\n");
        if(top!=0)printf("No\n");
    }
    return 0;

}

第二个题相比于第一个题有些不一样,可以仔细体会他们的区别

 

#include<stdio.h>
#include<string.h>
char a[10000][10000],b[10000];
int main()
{
    while(gets(a[0])!=NULL)
    {
        int i=0;
        while(1)
        {
            i++;
            gets(a[i]);
            if(strcmp(a[i],"Ctrl+Z")==0)
                break;
        }
        int flag=0,top=0;
        for(int k=0; k<i; k++)
        {
            int l=strlen(a[k]);
            for(int j=0; j<l; j++)
            {
                if(a[k][j]=='('||a[k][j]=='{')
                {
                    top++;
                    b[top]=a[k][j];
                }
                else
                {
                    if((b[top]=='('&&a[k][j]==')')||(b[top]=='{'&&a[k][j]=='}'))
                    {
                        top--;
                    }//匹配正确
                    else
                    {
                        flag=1;//不匹配
                        break;
                    }
                }
            }

        }
        if(flag==1)
        {
            printf("Wrong\n");
            continue;
        }
        if(top==0&&flag==0)printf("Right\n");
        if(top!=0)printf("Wrong\n");


    }

    return 0;
}


相信在练过这两个题后大家能进一步的加深对栈“先进后出”的特性的利用,如果有问题,希望能在评论区留言交流。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值