力扣(Leetcode)-栈-有效的括号-c语言-数据结构oj题

目录

a.题目链接:使用栈实现有效的括号

b.题目:

一、题意解析

1.a 题目的核心思想

二、题目具体实现

1.初

2.为此我们应该在最后检验栈中是否还有元素需用STEmpty(&st)这个函数。

3.所以该如何检查右括号数量多于左括号的问题呢?让我们再回看代码,如果是右括号就会开始匹配,这时如果栈内已经空了呢?是不是应该直接返回false?


a.题目链接:使用栈实现有效的括号

有效的括号icon-default.png?t=N7T8https://leetcode.cn/problems/valid-parentheses/description/

b.题目:

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

题目所给代码:

bool isValid(char* s) {

   

}

一、题意解析

我认为这道题最重要的问题是理解题意,由已知条件我们可以明白这几个点:

1.在栈内所存储的数据类型是char字符类型。

且只有三种类型括号组成:'('')''{''}''['']' 

2.括号只有三种,每个左括号只与和他同种类型有括号匹配,因此从这里我们就可以知道,做题的思路可以有先判断数量问题,可先判断这个字符串的字符个数是偶数个,但我们这里用栈来实现,需要用到其他判断数量的方法,我们接着看。

3.左括号必须以正确的顺序闭合,这种正确顺序到底是什么意思?刚开始阅读的时候我也没体会到它的深意,事实上,这种正确的顺序就是指,不可跨越。

举一个栗子:"{({[)]}}" 、"{](}[)" 、"{]"与  "[{{()}}]"、"[]{}()"、"[]"们的数量都是偶数个,且每种类型括号都是相互匹配,但是顺序有差异。可以将两组字符串的括号用于数学计算中,就可以明显观察出第一组括号是无法组成一个有效的数学计算

1.a 题目的核心思想

用栈的方法来实现道题的核心思想是:

左括号入栈,遇到右括号的时候,栈顶元素必须为匹配的左括号。

接下来我们可以开始做题

由于题目只给出了需要实现的函数,但在实现的过程中我们需要用到栈,我们使用的是c语言解答因此还需用到栈的那些函数具体可见上篇博客:栈和队列概念与实现

二、题目具体实现

接下来让我们一步一步实现这个代码:我们用到的思想是:使左括号入栈,右括号来匹配

注意:右括号始终都没有入栈

1.初

bool isValid(char* s) {
    ST st;
    STInit(&st);
    while (*s)
//到‘/0’就结束
    {
        if (*s == '[' || *s == '{' || *s == '(')
        {
            STPush(&st, *s);
        }
        else
        {
            char top = STTop(&st);
//这里就直接将左括号进行存入,方便后续比较
            STPop(&st);//左括号出栈

            //顺序不匹配
            if ((*s == ']' && top != '[')
                || (*s == '}' && top != '{')
                || (*s == ')' && top != '('))
            {
                return false;
            }
        }
        ++s;
    }

    STDestroy(&st);

    return ret;
}

如果我们直接用现在的函数就去做题的话就会发现有问题

从这里我们可以分析出,字符串中只有一个左括号,在经过现有函数的筛选之后,根本没有右括号。

实际上就是左括号数量多于右括号的问题。

2.为此我们应该在最后检验栈中是否还有元素需用STEmpty(&st)这个函数。

bool isValid(char* s) {

    ST st;

    STInit(&st);

    while (*s)

    {

        if (*s == '[' || *s == '{' || *s == '(')//如果是左括号则存入st

        {

            STPush(&st, *s);

        }

        else//如果是右括号则可以开始与st栈顶元素匹配

        {

            char top = STTop(&st);

            STPop(&st);

            if ((*s == ']' && top != '[')

                || (*s == '}' && top != '{')

                || (*s == ')' && top != '('))

            {

                return false;

            }

        }

        ++s;

    }

    bool ret = STEmpty(&st);

    STDestroy(&st);

    return ret;

}

这样难道就正确了吗?结果我们提交:戏剧性一面出来了,而这里显然是刚才没有考虑全面

实际上就是右括号数量多于左括号的问题。

3.所以该如何检查右括号数量多于左括号的问题呢?让我们再回看代码,如果是右括号就会开始匹配,这时如果栈内已经空了呢?是不是应该直接返回false?

bool isValid(char* s) {

    ST st;

    STInit(&st);

    while (*s)

    {

        if (*s == '[' || *s == '{' || *s == '(')//如果是左括号则存入st

        {

            STPush(&st, *s);

        }

        else//如果是右括号则可以开始与st栈顶元素匹配

        {
           //右括号比左括号多,数量匹配问题2
            if (STEmpty(&st))
            {
                return false;
            }

            char top = STTop(&st);

            STPop(&st);

            //这里进行顺序匹配

            if ((*s == ']' && top != '[')

                || (*s == '}' && top != '{')

                || (*s == ')' && top != '('))

            {

                return false;

            }

        }

        ++s;

    }

    //左括号比右括号多,数量匹配问题1

    bool ret = STEmpty(&st);

    STDestroy(&st);

    return ret;

}

 最后这道题就解决啦。

结语:

       随着这篇关于题目解析的博客接近尾声,我衷心希望我所分享的内容能为你带来一些启发和帮助。解题的过程往往充满挑战,但正是这些挑战让我们不断成长和进步。我在准备这篇文章时,也深刻体会到了学习与分享的乐趣。

       在此,我要特别感谢每一位阅读到这里的你。是你的关注和支持,给予了我持续写作和分享的动力。我深知,无论我在某个领域有多少见解,都离不开大家的鼓励与指正。因此,如果你在阅读过程中有任何疑问、建议或是发现了文章中的不足之处,都欢迎你慷慨赐教。         你的每一条反馈都是我前进路上的宝贵财富。同时,我也非常期待能够得到你的点赞、收藏,这将是对我莫大的支持和鼓励。当然,我更期待的是能够持续为你带来有价值的内容,让我们在知识的道路上共同前行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值