当前位置:   article > 正文

C语言/数据结构——每日一题(有效的括号)

C语言/数据结构——每日一题(有效的括号)

一.前言

如果想要使用C语言来解决这道题——有效的括号:https://leetcode.cn/problems/valid-parentheses/description/我们必须要借用上一篇我们所讲的内容——栈的实现:https://blog.csdn.net/yiqingaa/article/details/138923750?spm=1001.2014.3001.5502

因为在C语言环境下,力扣不会主动帮你实现栈,需要用户自己手动创建栈。但是在C++环境下,力扣会主动为我们实现栈。

2.正文 

1.1题目描述

1.2题目分析

1.21 题目想让用户干什么

这道题为我们用户提供了一个字符串s。我们需要编写程序来判断所给字符串s中,相同类型的左括号与右括号是否一 一匹配。如果匹配正确就返回true。匹配不正确就返回false。

 1.22 如何求解题目

这道题我们可以运用栈的知识面来求出这道题。

我们可以先创建一个栈变量st,然后让字符串s逐一遍历字符,如果遍历过程中字符是‘(’    ‘[’   ‘{’   都可以将它们尾插到我们栈当中。如果在遍历过程中不是‘(’    ‘[’   ‘{’ ,而是‘)’    ‘]’   ‘}’我们可以调用之前写好的函数功能——取出栈顶元素( STDataType STTop(ST* ps) 这里的SLDataType是我们栈数据类型,可能是int、char或者其他类型。),调出可能之前存入栈的字符‘(’    ‘[’   ‘{’ ,并与遍历字符作对比。这里我暂且将取出栈顶的元素用变量top接受。我们就有取出栈顶元素,与现在遍历字符的关系:

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

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

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

满足上面其中一个条件我们就可以说明,相同类型的左括号与右括号没有一 一匹配。我们直接返回false即可。

值得注意的是:在返回true,或者false之前,都要对栈进行销毁处理——void STDestroy(ST* ps)

1.3代码实现

  1. typedef int STDataType;
  2. struct Stack
  3. {
  4. STDataType* a;
  5. int top;
  6. int capacity;
  7. };
  8. typedef struct Stack ST;
  9. void STInit(ST* ps);//栈的初始化
  10. void STDestroy(ST* ps);//栈的销毁
  11. void STPush(ST*PS,STDataType x);//入栈
  12. void STPop(ST* ps);//出栈
  13. STDataType STTop(ST* ps);//取栈顶的数据
  14. bool STEmpty(ST*ps);//判空
  15. int STSize(ST* PS);//获取数据个数
  16. void STInit(ST *ps)//栈的初始化
  17. {
  18. assert(ps);
  19. ps->a = NULL;
  20. ps->capacity = ps->top = 0;
  21. }
  22. void STDestroy(ST* ps)//栈的销毁
  23. {
  24. assert(ps);
  25. free(ps->a);
  26. ps->a = NULL;
  27. ps->top = ps->capacity = 0;
  28. }
  29. void STPush(ST* ps, STDataType x)//入栈
  30. {
  31. assert(ps);
  32. if (ps->capacity == ps->top)
  33. {
  34. int newcapacity = ps->capacity == 0 ? 10 : ps->capacity*2;
  35. STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));
  36. if (tmp == NULL)
  37. {
  38. perror("realloc fail!");
  39. return;
  40. }
  41. ps->a = tmp;
  42. ps->capacity = newcapacity;
  43. }
  44. ps->a[ps->top] = x;
  45. ps->top++;
  46. }
  47. void STPop(ST* ps)//删除栈顶元素
  48. {
  49. assert(ps);
  50. assert(ps->a);
  51. ps->top--;
  52. }
  53. STDataType STTop(ST* ps)//取出栈顶元素
  54. {
  55. assert(ps);
  56. assert(ps->top >= 0);
  57. return ps->a[ps->top-1];
  58. }
  59. bool STEmpty(ST* ps)//判断栈内元素是否为空
  60. {
  61. assert(ps);
  62. if (ps->top == 0)
  63. return true;
  64. return false;
  65. }
  66. int STSize(ST* ps)//获取数据个数
  67. {
  68. assert(ps);
  69. return ps->top ;
  70. }
  71. bool isValid(char* s)
  72. {
  73. ST st;
  74. STInit(&st);
  75. while (*s)
  76. {
  77. if (*s == '(' || *s == '{' || *s == '[')
  78. {
  79. STPush(&st, *s);
  80. }
  81. else
  82. {
  83. if(STEmpty(&st))//这一步是必须的,因为如果栈为空且*s是')' ']' '}',说明
  84. //题目给出的字符可能是这样的“)”、“(){}]”。类似这种情况都是不符合题意的情况。
  85. return false;
  86. char top = STTop(&st);
  87. STPop(&st);//这里一定要进行尾部栈顶元素删除,以便遍历字符和栈内字符能够对的上
  88. if ((top == '(' && *s != ')') ||
  89. (top == '{' && *s != '}') ||
  90. (top == '[' && *s != ']'))
  91. {
  92. return false;
  93. }
  94. }
  95. ++s;
  96. }
  97. if (st.top != 0)
  98. return false;
  99. STDestroy(&st);
  100. return true;
  101. }

三.结言 

今天的题目分享就到此结束了,觉得对你有所帮助的同学,能不能求一个三连。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/611777
推荐阅读
相关标签
  

闽ICP备14008679号