• LeetCode20——有效的括号


      在记事本中写算法题和在纸上写其实感觉差不多,反正是不能进行调试。想起某高手的话,写代码要做到“人机合一”,写高级语言时(指的是 C 和 C++)脑海中要知道当前写的代码对应的反汇编代码,也就是要深入了解编译器对高级语言的处理。什么时候能达到这样的境界呢?

    LeetCode 题库的第 20 题——有效的括号

      我做题的习惯跟考试的习惯差不多,先找会做的,然后再慢慢啃不会的。本着一个原则,不用编译器,不去找答案,不会说明基础不牢固,继续补基础。

      题目我截图过来。

      上面的图是题目和给出的示例,示例是用来补充题目的,看着示例就知道什么时候应该返回 true ,什么时候返回 false 了。

    解题思路

      LeetCode 都会给出每个题的函数定义,比如这个题的定义如下:

    1 bool isValid(char* s) {
    2 }

      我选择的是 C 语言来答题。

      这个题中告诉我们:

      1、正确的括号包括 括弧、方括号 和 花括号;

      2、括号需要 成对 出现;

      3、函数传递过来的是字符串。

      那么,我的思路是:

      1、获得字符串的长度,用来 申请一块 堆空间 和 遍历括号;

      2、申请一块同样大小的 堆内存空间 做数组,用来模拟 堆栈 数据结构;

      3、用一个变量来记录栈顶的位置,其实就是数组当前的下标;

      4、然后遍历括号,如果是 ( [ { ,那么就进入 堆栈,并修改栈顶的位置;

      5、如果是 ) ] } 那么就去和当前数组位置的前一个值进行比较,如果能够闭合,那么就让前一个出栈,并且修改栈顶的位置;

      6、如果无法闭合,那么就返回假;

      7、循环完成后,如果 堆栈 为空,说明括号都可以闭合,就返回 1,C 语言中 非0 为真;

      8、如果 堆栈 不为空,说明有尚未闭合的括号,就返回0, C 语言中 0 为假。

    解题答案

      这个题就是 数据结构 中堆栈的应用,还是比较简单的。完整代码如下:

     1 bool isValid(char* s) {
     2     int len = strlen(s);
     3     int i;
     4     int pos = 0;
     5     
     6     char *pArr = (char*)malloc(len * sizeof(char));
     7     
     8     for ( i = 0; i < len; i ++ ) {
     9         if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
    10             pArr[pos ++] = s[i];
    11         }
    12         if (s[i] == ')') {
    13             if ( pArr[pos - 1] != '(' ) {
    14                 return 0;
    15             } else {
    16                 pos--;
    17             }
    18         } else if (s[i] == '}') {
    19             if ( pArr[pos - 1] != '{' ) {
    20                 return 0;
    21             } else {
    22                 pos--;
    23             }
    24         } else if (s[i] == ']') {
    25             if ( pArr[pos - 1] != '[' ) {
    26                 return 0;
    27             } else {
    28                 pos--;
    29             }
    30         }
    31     }
    32     
    33     if ( pos != 0 ) {
    34         return 0;
    35     }
    36     
    37     return 1;
    38 }

      代码写的好不好就不管了,很多题都是 主调函数 释放空间,所以答题时,没有将 堆空间 释放掉,同样的 申请堆空间后,也没有判断内存是否申请成功。有很多地方写的不严谨,以后改正。


    我的微信公众号:“码农UP2U”

  • 相关阅读:
    封装logging模块,创建日志器
    excel的读写封装,利用openpyxl
    利用yaml封装配置文件模块
    自动生成小学四则运算项目(更新)
    基于cmmi的软件工程及实训指导 第一章 读后感
    第一次数据库学习
    第一个爬虫和测试
    预测球队成绩
    第一个网页
    科学计算与可视化
  • 原文地址:https://www.cnblogs.com/tosser/p/9417049.html
Copyright © 2020-2023  润新知