6-1 括号匹配判断(PTA栈)(C语言解法)

题目描述

本题实现求表达式中括号是否匹配。只需判断表达式中括号(本题中只会出现三种括号,分别是小括号,中括号和大括号)是否匹配,表达式中可以有其他值也可没有。

函数接口定义:
int  match (char *exp);
其中 exp 为需判断括号是否正确的表达式,返回值为1或0,如果为1,则表示括号匹配,0表示不匹配。

裁判测试程序样例:
#include <stdio.h>
#define N 20
int  match (char *exp);

int main()
{
    char s[N];
    int flag;
    scanf("%s",s);
    flag=match(s);
    if(flag)
        printf("%s match",s);
    else
        printf("%s not match",s);
    return 0;
}

/* 请在这里填写答案 */
输入样例1:
{[2*(3+2)-7]}/4
输出样例1:
{[2*(3+2)-7]}/4 match
输入样例2:
{[()]}
输出样例2:
{[()]} match

解题思路

对栈有一定的了解思考一下就可以做出来了,相关的思路已经在代码注释里给出,有不会的评论区提问即可

有一些写法比较简洁,如果不习惯也可以用if判断再return

C语言解法

int  match (char *exp)
{
    typedef struct{
        char data[N]; //在C语言中用char数组模拟string
        int top; //栈顶指针
    }myStack;

    myStack S; //开辟结构体
    S.top=-1; //初始化栈顶指针

    while(*exp) //当exp指针指导最后一个即\0时等效于NULL
    {
        if(*exp=='{'||*exp =='(' || *exp=='[') //如果是左括号 压栈
        {
            if(S.top<N-1) //判断栈是否已满
            {
                S.data[++S.top]=*exp; //未满则存入数组并且移动栈顶指针
            }
            else // 如果左括号都会满的话 没有空间给右括号了 直接返回0代表表达式错误
            {
                return 0;
            }
        }
        else if(*exp=='}' || *exp==')' || *exp==']') //如果是右括号
        {
            if(S.top==-1) //如果此时栈空 代表表达式错误(先要有左括号才能有右括号)
            {
                return 0;
            }
            else //栈不为空
            {
                char left=S.data[S.top--]; //取栈顶元素并且移动栈顶指针
                if((left=='{' && *exp!='}') || (left=='(' && *exp !=')') ||
                   (left=='[' && *exp!=']')) //如果左右括号不匹配 直接错误
                {
                    return 0;                    
                }
            }
        }
        exp++; //移动exp指针
    }
    return S.top==-1; //如果正常的话,匹配完栈又是返回初始状态的
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值