• leetcode:20. 有效的括号


    一、题目:

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

     

    函数原型:bool isValid(char* s)

    二、思路:

    利用栈来解这道题会方便许多:

    遍历字符串s,当遇到左括号就将其压入栈中;遇到右括号首先判断栈是否为空,如果为空说明左右括号数量不匹配返回false,再判断它与左括号是否匹配,如果不匹配返回false,如果匹配则将栈顶元素出栈。全部遍历完成后,如果栈不为空,说明左右括号数量不匹配,返回false,如果栈为空则返回true。

    三、代码:

    1. //顺序栈的结构定义
    2. typedef char STDataType;
    3. typedef struct Stack {
    4. STDataType* a;
    5. int top;
    6. int capacity;
    7. }ST;
    8. //顺序栈的初始化
    9. void STInit(ST* pst)
    10. {
    11. assert(pst);
    12. pst->a = NULL;
    13. pst->top = 0;//top指针指向栈顶元素的下一位
    14. pst->capacity = 0;//顺序栈的容量
    15. }
    16. //顺序栈的打印
    17. void STPrint(ST pst)
    18. {
    19. for (int i = 0; i < pst.top; i++)
    20. {
    21. printf("%d ", pst.a[i]);
    22. }
    23. printf("\n");
    24. }
    25. //顺序栈的入栈
    26. void STPush(ST* pst, STDataType x)
    27. {
    28. assert(pst);
    29. //检查扩容
    30. if (pst->top == pst->capacity)
    31. {
    32. int newcapacity = pst->capacity == 0 ? 4 : 2 * pst->capacity;
    33. STDataType* p = (STDataType*)realloc(pst->a, newcapacity * sizeof(STDataType));
    34. if (p == NULL)
    35. {
    36. perror("realloc fail");
    37. exit(-1);
    38. }
    39. else
    40. {
    41. pst->a = p;
    42. pst->capacity = newcapacity;
    43. }
    44. }
    45. pst->a[pst->top++] = x;
    46. }
    47. //顺序栈出栈
    48. void STPop(ST* pst)
    49. {
    50. assert(pst);
    51. assert(pst->top > 0);
    52. pst->top--;
    53. }
    54. //求顺序栈栈顶元素
    55. STDataType STTop(ST* pst)
    56. {
    57. assert(pst);
    58. assert(pst->top > 0);
    59. return pst->a[pst->top - 1];
    60. }
    61. //顺序栈判空
    62. bool STEmpty(ST* pst)
    63. {
    64. assert(pst);
    65. return pst->top == 0;
    66. }
    67. //顺序栈销毁
    68. void STDestroy(ST* pst)
    69. {
    70. assert(pst);
    71. if (pst->a != NULL)
    72. {
    73. free(pst->a);
    74. pst->a = NULL;
    75. pst->top = 0;
    76. pst->capacity = 0;
    77. }
    78. }
    79. bool isValid(char* s) {
    80. //定义顺序栈
    81. ST st;
    82. //初始化顺序栈
    83. STInit(&st);
    84. int len=strlen(s);
    85. for(int i=0;i
    86. {
    87. if(s[i]=='('||s[i]=='{'||s[i]=='[')
    88. {
    89. STPush(&st,s[i]);
    90. }
    91. else if(s[i]==')'||s[i]=='}'||s[i]==']')
    92. {
    93. if(STEmpty(&st))
    94. return false;
    95. else
    96. {
    97. if((STTop(&st)=='('&&s[i]!=')')||(STTop(&st)=='{'&&s[i]!='}')||(STTop(&st)=='['&&s[i]!=']'))
    98. return false;
    99. STPop(&st);
    100. }
    101. }
    102. }
    103. if(!STEmpty(&st))
    104. return false;
    105. else
    106. return true;
    107. }
  • 相关阅读:
    基于springboot+vue的社区健康码管理系统(前后端分离)
    C#事件详解及应用示例
    使用 Elastic 和 LM Studio 的 Herding Llama 3.1
    什么是CAP理论?
    记录小技巧--前端等所有的请求都结束了再刷新页面,button对齐input
    软件设计文档示例模板 - 学习/实践
    PHP代码审计17—CLTPHP代码审计
    VMware——WindowServer2012R2环境mysql5.7.14解压版安装主从复制(图解版)
    每日三题 8.17
    一文就懂HashMap原理!学不会你来砍我!
  • 原文地址:https://blog.csdn.net/2301_76197086/article/details/134543113