有效的括号

一:题目

二:思路讲解

1:先把该函数需要的栈的函数放在前面。

该问题的前提是得有栈的实现为前提,博主链接栈的实现(一篇包懂)-CSDN博客 已经详细讲解了栈的实现。

需要的栈的代码:

typedef char STDataType;
typedef struct Stack {
    STDataType* a;
    int top;
    int capacity;
} ST;

void STInit(ST* ps) {
    assert(ps);
    ps->a = NULL;
    ps->capacity = 0;
    ps->top = 0;
}
// 销毁栈
void STDestroy(ST* ps) {
    assert(ps);
    free(ps->a);
    ps->a = NULL;
    ps->capacity = 0;
    ps->top = 0;
}
// 入栈函数
void STPush(ST* ps, int x) {
    assert(ps);
    if (ps->capacity == ps->top) {
        int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
        STDataType* tmp =
            (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
        if (tmp == NULL) {
            perror("realloc fales");
            exit(-1);
        }
        ps->a = tmp;
        ps->capacity = newcapacity;
    }
    ps->a[ps->top] = x;
    ps->top++;
}
// 出栈函数
void STPop(ST* ps) {
    assert(ps);
    assert(ps->top > 0);

    ps->top--;
}
// 返回栈顶元素
STDataType STTop(ST* ps) {
    assert(ps);
    assert(ps->top > 0);

    return ps->a[ps->top - 1];
}
// 获取栈中元素个数
int STSize(ST* ps) {
    assert(ps);

    return ps->top;
}
// 检测栈是否为空
bool STEmpty(ST* ps) {
    assert(ps);

    return ps->top == 0;
}

2:逢左括号入栈,逢右括号出栈

 解释:因为栈是后进先出,所以当你把左括号都入栈的时候,这个时候,当你遇到一个右括号,这个右括号一定是和最后入的左括号是匹配的(ture的情况下),然后你就出栈左括号,然后看这左右括号是否匹配 即可。

3:false的情况

解释:

a:顺序不匹配,如③

b:数量不匹配,① 和②都是数量不匹配

三:代码

bool isValid(char* s) {

    ST st;
    STInit(&st);

    //*s不为\0则继续(\0的ascll码值是0)
    while (*s) {
        //遇到左括号就入栈
        if (*s == '[' || *s == '{' || *s == '(') {
            STPush(&st, *s);
        } 
        else //右括号进入else
        {
            //此时想要出栈一个左括号,检测是否匹配
            //但是栈为空,则数量不匹配,false
            if (STEmpty(&st)) 
            {
                STDestroy(&st);
                return false;
            }
             else//栈不为空,则出栈检测匹配
            {
                //出栈括号放进top
                char top = STTop(&st);
                //记得删除
                STPop(&st);
                //[] () {} 都不匹配,则false
                if (*s == ']' && top != '[' || *s == '}' && top != '{' ||
                    *s == ')' && top != '(') {
                    STDestroy(&st);
                    return false;
                }
            }
        }
        //来到这里,代表前面匹配成功
        //则对下一个括号,进行判断
        s++;
    }

    //得到检测栈空的bool值
    //栈空代表 全部匹配成功
    //栈不为空代表数量不匹配(有多余的左括号)
    bool ret = STEmpty(&st);
    STDestroy(&st);
    //返回bool值
    return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值