• 每日一练——有效的括号


    20. 有效的括号 - 力扣(LeetCode)

    错误记录

    1. #include
    2. #include
    3. #include
    4. #include
    5. typedef char STDataType;
    6. typedef struct Stack
    7. {
    8. STDataType* a;
    9. int capacity;
    10. int top;
    11. } Stack;
    12. void STInit(Stack* st);
    13. void STDestroy(Stack* st);
    14. void STPush(Stack* st, STDataType x);
    15. STDataType STPop(Stack* st);
    16. STDataType STTop(Stack* st);
    17. int STSize(Stack* st);
    18. bool STEmpty(Stack* st);
    19. void STInit(Stack* st)
    20. {
    21. assert(st);
    22. st->a = NULL;
    23. st->capacity = st->top = 0;
    24. }
    25. void STDestroy(Stack* st)
    26. {
    27. assert(st);
    28. free(st->a);
    29. st->a = NULL;
    30. st->capacity = st->top = 0;
    31. }
    32. void STPush(Stack* st, STDataType x)
    33. {
    34. assert(st);
    35. //checkcapacity
    36. if (st->capacity == st->top)
    37. {
    38. int newcapacity = st->capacity == 0 ? 4 : st->capacity * 2;
    39. STDataType* temp = (STDataType*)realloc(st->a, sizeof(STDataType) * newcapacity);
    40. if (NULL == temp)
    41. {
    42. perror("realloc failed");
    43. exit(-1);
    44. }
    45. st->a = temp;
    46. st->capacity = newcapacity;
    47. }
    48. st->a[st->top] = x;
    49. ++st->top;
    50. }
    51. STDataType STPop(Stack* st)
    52. {
    53. assert(st);
    54. assert(st->top);
    55. STDataType ret = STTop(st);
    56. --st->top;
    57. return ret;
    58. }
    59. STDataType STTop(Stack* st)
    60. {
    61. assert(st);
    62. assert(st->top);
    63. return st->a[st->top - 1];
    64. }
    65. int STSize(Stack* st)
    66. {
    67. return st->top;
    68. }
    69. bool STEmpty(Stack* st)
    70. {
    71. return st->top == 0;
    72. }
    73. bool isValid(char* s)
    74. {
    75. Stack st;
    76. STInit(&st);
    77. int i = 0;
    78. while(*s)
    79. {
    80. if(*s == '(' || *s == '[' || *s == '{')
    81. STPush(&st, *s);
    82. else
    83. {
    84. if((STPop(&st) == '(' && *s != ')') ||
    85. (STPop(&st) == '[' && *s != ']') ||
    86. (STPop(&st) == '{' && *s != '}'))
    87. {
    88. STDestroy(&st);
    89. return false;
    90. }
    91. }
    92. ++s;
    93. }
    94. STDestroy(&st);
    95. return true;
    96. }

     

    这里比较三次直接出了3次栈,应该只出一次比较三次。

    修改成下面这样:

    之后在" ( "和" ) "又分别翻车了,加了下面两句判断。

    最终提交

    1. #include
    2. #include
    3. #include
    4. #include
    5. typedef char STDataType;
    6. typedef struct Stack {
    7. STDataType* a;
    8. int capacity;
    9. int top;
    10. } Stack;
    11. void STInit(Stack* st);
    12. void STDestroy(Stack* st);
    13. void STPush(Stack* st, STDataType x);
    14. STDataType STPop(Stack* st);
    15. STDataType STTop(Stack* st);
    16. int STSize(Stack* st);
    17. bool STEmpty(Stack* st);
    18. void STInit(Stack* st) {
    19. assert(st);
    20. st->a = NULL;
    21. st->capacity = st->top = 0;
    22. }
    23. void STDestroy(Stack* st) {
    24. assert(st);
    25. free(st->a);
    26. st->a = NULL;
    27. st->capacity = st->top = 0;
    28. }
    29. void STPush(Stack* st, STDataType x) {
    30. assert(st);
    31. // checkcapacity
    32. if (st->capacity == st->top) {
    33. int newcapacity = st->capacity == 0 ? 4 : st->capacity * 2;
    34. STDataType* temp =
    35. (STDataType*)realloc(st->a, sizeof(STDataType) * newcapacity);
    36. if (NULL == temp) {
    37. perror("realloc failed");
    38. exit(-1);
    39. }
    40. st->a = temp;
    41. st->capacity = newcapacity;
    42. }
    43. st->a[st->top] = x;
    44. ++st->top;
    45. }
    46. STDataType STPop(Stack* st) {
    47. assert(st);
    48. assert(st->top);
    49. STDataType ret = STTop(st);
    50. --st->top;
    51. return ret;
    52. }
    53. STDataType STTop(Stack* st) {
    54. assert(st);
    55. assert(st->top);
    56. return st->a[st->top - 1];
    57. }
    58. int STSize(Stack* st) { return st->top; }
    59. bool STEmpty(Stack* st) { return st->top == 0; }
    60. bool isValid(char* s) {
    61. Stack st;
    62. STInit(&st);
    63. int i = 0;
    64. while (*s) {
    65. if (*s == '(' || *s == '[' || *s == '{')
    66. STPush(&st, *s);
    67. else
    68. {
    69. if(STEmpty(&st))
    70. {
    71. STDestroy(&st);
    72. return false;
    73. }
    74. char topval = STPop(&st);
    75. if ((topval == '(' && *s != ')') ||
    76. (topval == '[' && *s != ']') ||
    77. (topval == '{' && *s != '}'))
    78. {
    79. STDestroy(&st);
    80. return false;
    81. }
    82. }
    83. ++s;
    84. }
    85. if(!STEmpty(&st)) return false;
    86. STDestroy(&st);
    87. return true;
    88. }

    修改日志

    2024/6/12

    一处return的时候忘记调用STDestroy,有内存泄漏风险,补上了。

    把变量top名称改成了topval,避免与Stack的成员top混杂,增强代码可读性。

  • 相关阅读:
    python_04
    四川思维跳动商务信息咨询有限公司可信吗?
    文举论金:黄金原油全面走势分析策略独家指导
    使用IntelliJ IDEA创建Maven项目并上传项目至gitlab等远程仓库
    深入Python网络编程:基础、工具和实践
    计算机毕业设计(附源码)python学生信息管理系统
    全链路压测效能10倍提升的压测工具实践笔记
    推荐系统介绍
    社交APP的核心功能都有哪些
    SQL注入之文件读写
  • 原文地址:https://blog.csdn.net/weixin_73483158/article/details/139637001