【力扣】20. 有效的括号-纯C-栈的理解及运用

问题

在这里插入图片描述

思路

 这个题要理解透彻采用栈的结构,遇到(,{,[,三种结构就进行入栈,每次出现相对的就与栈顶相比较,如果栈顶没有东西可比较的则也是错误情况返回false,如果不同就返回false;如果相同栈顶指针向下移动,对消完毕,舍弃前面栈顶的值,pt指向新的栈顶。
 还有一种情况就是最后没有对消完,也就是((((的情况,则要返回假

  • 只要进入这个else里面就代表要与栈顶进行对比,看看能不能对消掉
  • 如果栈顶没有存放任何东西,就代表这个进入是错误的进入,因为你进来的目的就是要与栈顶进行对比的,所以pt==0时进入这个else也是错误的一种情况
  • 想要与栈顶对消,就要保证栈顶是有与之对消的东西存在的,否则对消什么??
  • 例如:(){}}{的情况,运行到栈顶,已经栈顶已经为空了,说明(){}已经对消完了,如果下一个正确,就应该入栈,但是}显然会出栈,所以会出现错误结果

解题方法

模仿栈

Code

bool isValid(char* s) {

    int len = strlen(s);
    char* temp = (char*)malloc(sizeof(char) * 50000); // 栈
    int pt = 0;
    // 这个题要理解透彻采用栈的结构
    // 遇到(,{,[,三种结构就进行入栈,每次出现相对的就与栈顶相比较,如果相同就出栈,如果不同就返回false
    if(len<=1||len%2==1)return false;
    while (*s != '\0') {

        if (*s == '(' || *s == '[' || *s == '{') {
            temp[pt++] = *s++;
        } else {
            //只要进入这个else里面就代表要与栈顶进行对比,看看能不能对消掉
            //如果栈顶没有存放任何东西,就代表这个进入是错误的进入,所以pt==0时进入这个else也是错误的一种情况
            //想要与栈顶对消,就要保证栈顶是有东西存在的,否则对消什么??
            //例如:(){}}{的情况,运行到栈顶,已经栈顶已经为空了,说明(){}已经对消完了,如果下一个正确,就应该入栈,但是}显然会出栈,所以会出现错误结果
            switch (*s) {
            case ']':*s = '[';break;
            case ')':*s = '(';break;
            case '}':*s = '{'; break;
            }
            //这里要理解pt==0条件为假的重要性,因为如果都没有往temp里面放东西,就代表不存在对消
            //例如:(){}}{的情况
            if (pt==0||*s++ != temp[--pt]) {
                return false;
            }
        }
    }
    if (pt == 0)//最后没有对消完,也就是((((的情况,则要返回错误
        return true;
    else
        return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值