noj.7-括号匹配

在这里插入图片描述
思路:
括号匹配需要一一对应且从左向右遇到的第一个右括号需要与该右括号左边的第一个左括号类型匹配,即左小括号与右小括号,左中括号与右中括号,左大括号与右大括号匹配。

不满足的情况有三种类型:

1( ( )左右括号个数不同
2( { ) }非法匹配1
3)()(非法匹配2

1.模拟括号匹配的过程,可以建立一个栈,遇到左括号进栈,遇到右括号则先判断栈是否为空,若栈为空输出no (对应表格中第三种情况),若栈不为空,将栈顶元素与该右括号进行匹配。如果匹配成功栈顶元素出栈,否则输出no(对应表格中的第二种情况)。
2.将括号串读完以后,若栈不为空则输出no,若栈为空则输出yes。(对应表格中第一种情况)

完整代码展示:

#include <iostream>
#include<string.h>
using namespace std;

#define max 100
typedef struct
{
    char num[max];
    int top;
}stack;
//初始化
void initstack(stack *a)
{
    a->top=-1;
}
//判断是否为空
int isempty(stack *a)
{
    if(a->top==-1)
        return true;
   else
        return false;
}
//进栈
int push(stack *a,char n)
{
    if(a->top==max-1)
        return false;
    a->top++;
    a->num[a->top]=n;
    return true;
}
//出栈
int pop(stack *a,char *n)
{
    if(a->top==-1) return false;
    else
    {
        *n=a->num[a->top];
        a->top--;
        return true;
    }
}
//获得栈顶元素
int gettop(stack *a,char *n)
{
    if(a->top==-1) return false;
    else
      {
          *n=a->num[a->top];
          return true;
      }
}
//右括号与栈顶括号匹配
int match(char a,char b)
{
    if(a=='('&&b==')') return 1;
    else if(a=='['&&b==']') return 1;
    else if(a=='{'&&b=='}') return 1;
    else return 0;
}
//括号匹配
void kuohaomatch(char *str)
{
    stack 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 ;}
            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 ans[max];
    cin>>ans;
    kuohaomatch(ans);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

T1009∞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值