数据结构——用顺序栈实现括号匹配

CSDN的朋友们,你们好哇哈哈哈哈哈哈哈,我好久没有更新啦!!!

大家猜猜我这段时间都去干啥了哇!没错,去参加学校的生产实习啦歪!每天自己PUA自己写代码:你这么菜,还不认真敲代码?(狗头)

一开始死命的纠结到底水一水实训还是认真搞哇!!最后还是选择踏踏实实搞实训得了,然后刚开始还一边担心15天没有复习考研的内容啊啊啊啊啊啊!实训每天都忙不过来,但是但是但是第一次写大型项目饿了么外卖还是挺挺挺多收获的喔!虽然使用c/c++开发基于MFC对话框使用socket实现服务器端与多客户端商家端通信!现在好多公司都使用QT!

刚开始一直纠结抱怨,昨天结训典礼我获得了唯一一个“优秀个人”奖,还是好开心哈哈哈哈哈,我怎么费事!善变的女孩哇哇哇哇哇!

下面言归正传咯,接着上次的啦!

用顺序栈实现括号匹配~

顺序栈的代码是使用的上次我写的代码!大家也可以自己把所有的重要的数据结构的代码写出来保存起来,到时候就可以拿出来直接用啦~

然后这个地方我使用了函数封装起来这一项功能,这样在主函数就可以直接调用啦~

主要理解的突破点就是:如果匹配不成功,那么就是三种情况!①左括号单身;②右括号单身;③左右括号不匹配!

然后说来奇怪,写完这个,今天中午午睡还梦见我有男朋友了,给我吓醒了哈哈哈,瞬间不想睡午觉了!专心搞事业的🆒!

上代码咯,有什么错误大家也可以指出来一起交流哇!

//使用顺序栈实现括号匹配

/*头文件*/
#include<stdio.h>
#include<string.h>

/*常量定义*/
#define MaxSize 50  //定义栈中元素最大个数
#define TRUE 1
#define FALSE 0

/*存储结构类型(顺序栈)定义*/
typedef char ElemType;
typedef struct  //静态存储分配
{
    ElemType data[MaxSize];  //存放栈中元素
    int top;                 //栈顶指针
}SqStack;

/*基本操作自定义函数说明*/
int InitStack(SqStack *S);  //初始化一个空栈
int StackEmpty(SqStack S);   //判断一个栈是否为空
int Push(SqStack *S,ElemType e);  //进栈
int Pop(SqStack *S,ElemType *e);   //出栈

/*自定义函数声明*/
int BracketCheck(char bracket[],int length);

/*主函数*/
int main()
{

    char bracket[50]={0};   //'\0'
    int flag;

    printf("请输入一行英文括号允许包含()[]{}:\n");
    gets(bracket);
    //puts(bracket);

    flag=BracketCheck(bracket,strlen(bracket));

    if(flag==TRUE)
        printf("\n括号匹配成功!\n");
    else printf("\n括号匹配失败!\n");

    return 0;
}

/*基本操作自定义函数定义*/
int InitStack(SqStack *S)
{
    (*S).top=-1;
    return TRUE;
}

int StackEmpty(SqStack S)
{
    if(S.top==-1)
        return TRUE;
    return FALSE;
}

int Push(SqStack *S,ElemType e)
{
    if((*S).top==MaxSize-1)  //栈满
    return FALSE;

    (*S).data[++(*S).top]=e;   //区分S.top初始值设为-1(栈顶指针指向当前栈顶元素)和0(栈顶指针指向当前栈顶元素的下一个)

    return TRUE;
}

int Pop(SqStack *S,ElemType *e)
{
    if((*S).top==-1) //栈空
    return FALSE;

    *e=(*S).data[(*S).top--];

    return TRUE;
}

/*自定义函数实现*/
int BracketCheck(char bracket[],int length)
{
    SqStack S;
    InitStack(&S);
    char ch;
    int i;

    for(i=0;i<length;i++)
    {
        if(bracket[i]=='('||bracket[i]=='{'||bracket[i]=='[')
            Push(&S,bracket[i]);     //左括号入栈
        else
        {
            if(StackEmpty(S))   //如果遇到右括号但是栈空则右括号单身
                return FALSE;

            Pop(&S,&ch);    //弹出栈顶元素

            if(bracket[i]==')'&&ch!='(')   //左括号右括号不匹配
                return FALSE;
            if(bracket[i]=='}'&&ch!='{')
                return FALSE;
            if(bracket[i]==']'&&ch!='[')
                return FALSE;
        }
    }

    if(StackEmpty(S))   //结束后判断左括号是否单身
        return TRUE;
    else return FALSE;

}

在这里插入图片描述

  • 12
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值