• 牛客网刷题-括号匹配问题


    前言:
    想要学好嵌入式,C语言与数据结构是必要熟练掌握的,而想熟练掌握一门语言,必须经过大量的练习,刷题,至少需要一两万行的代码量,才能具有一定的编程能力,至少拿到一个功能,怎么去用编程语言去实现它,从现在开始我要开启刷题之路,提高自己的编程水平,还有最重要的面试能力。
    推荐一款刷题神器

    一.括号匹配

    题目原型:
    在这里插入图片描述
    输入输出示例:
    在这里插入图片描述
    1.题目分析:题目意思很明确,判断要字符串里面的括号是否匹配,首先左右括号的数量要相等,第二要按顺序匹配,成对称状态。

    2.解题思路:
    要想解决这个问题很简单,利用栈的特性:后进先出,只要是左括号统统都入栈,等遍历到右括号则逐一取出栈顶元素进行匹配,如果全部匹配成功则返回true,否则返回false。

    代码实现:
    由于这次的题目比较简单我就不废话了,有代码详细注释。

    bool IsValidExp(char* s ) {
        // write code here
        ST stack;
        //初始化栈
        StackInit(&stack);
        while(*s)
        {
            switch(*s)
            {
                case '(':
                case '[':
                case '{':
                {
                 //碰到左括号统统入栈
                 StackPush(&stack,*s);
                 s++;
                 break;
                }
                case ')':
                case ']':
                case '}':
                {
                 //碰到右括号开始与栈顶元素进行匹配
                 //防止右括号比左括号多(一定不匹配返回false)
                 if(StackEmpty(&stack))
                 {
                    //销毁栈为什么栈为空了还销毁因为栈为空的判断条件是top指向\的位置是否是数组下标为零的元素,但是数组是malloc出来的只要有过元素入栈有空间分配
                    
                    StackDestory(&stack);
                    return false;
                 }
                 //取出栈顶元素
                 char top=StackTop(&stack);
                 StackPop(&stack);
                 //括号不匹配返回false
                 if( (top=='(' && *s!=')')
                   ||(top=='[' && *s!=']')
                   ||(top=='{' && *s!='}')
                   )
                 {
                   StackDestory(&stack);
                   return false;
                 }
                 else
                 {
                     s++;
                     break;
                 }
               }
                default:
                break;
            }
        }
         //栈为空(本来输入的就为空||括号匹配全部成功全部出栈)
         //防止左括号比右括号多的情况
         bool ret=StackEmpty(&stack);
         StackDestory(&stack);
         return ret;
    }
    

    二.如何高效刷题

    如何刷题:
    1.如果你是基础不太好,可以先按照题解,跟着手打代码,重点理解题目思路,将题目所用到的知识点,解题技巧提炼出来(锻炼代码能力,解题思路)。在这里插入图片描述
    2.当有一定的代码能力之后,但是看题还是没有思路,可以先看解题思路理解它,然后尝试用代码去实现它。(主要锻炼代码能力,进一步锻炼解题思维)

    3.拿到一个题目自己先尝试解题,最好是能将解题思路用画图的方式体现出来,这样更能加深印象,然后用代码实现,实现之后再看看题解,或者别人的解题方法,进行对比,找到最优解题思路
    在这里插入图片描述
    最后:在解题过程中,碰到问题如下图(题目提交后通不过,报错(代码可能有bug),尽量独立思考,可以先尝试用它的测试用例,一步一步走读代码,看看问题出现在那个地方,如果实在是没有看出来,可以将该函数拷贝到VS中进行调试代码,一定能找出来。(锻炼自己的代码调试能力)

    总结:
    要想学好嵌入式C语言是根本,但是也离不开数据结构,尤其是链表、队列方面的知识,就接下来我要更新的freerots实时操作系统,就需要用到大量的链表和队列的知识,要想提高自己的编程水平,笔试能力和面试技巧,就得大量刷题手打代码

  • 相关阅读:
    定时任务cron与crontab
    Lambda表达式 Stream流
    用DIV+CSS技术设计的网页与实现制作【体育文化】dreamweaver学生网页设计
    理解网络通信的基础:OSI七层模型与TCP/IP五层模型
    Apollo配置信息被程序识别的方式
    一款windows的终端神奇,类似mac的iTem2
    天宇优配|北上广深角逐“国字号”数据交易所 行业爆点
    文件加密,数据防泄密软件
    torch中tensor的相关操作
    CDGA|维护企业数据安全的六大管控措施
  • 原文地址:https://blog.csdn.net/k666499436/article/details/127044295