• 【栈与队列面试题】有效的括号(动图演示)


    leetcode20.括号匹配问题

    前言:

    💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥

    ✨✨刷题专栏:http://t.csdn.cn/UlvTc

    ⛳⛳本篇内容:力扣上栈与队列的面试OJ题目

    目录

    leetcode20.括号匹配问题

    1.问题描述

    2.前提准备

    3.问题题解        


    1.问题描述

    给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

    有效字符串需满足:

    1. 左括号必须用相同类型的右括号闭合。
    2. 左括号必须以正确的顺序闭合。
    3. 每个右括号都有一个对应的相同类型的左括号。

           

    2.前提准备

    栈的实现

    1. #pragma once
    2. #include<stdlib.h>
    3. #include<assert.h>
    4. #include<stdbool.h>
    5. #include<stdio.h>
    6. typedef int STDataType;
    7. typedef struct Stack
    8. {
    9. STDataType* a;
    10. int top;//栈顶的位置
    11. int capacity;//栈的容量
    12. }ST;
    13. void STInit(ST* pst);
    14. void STDestroy(ST* pst);
    15. void STPush(ST* pst,STDataType x);
    16. void STPop(ST* pst);
    17. STDataType STTop(ST* pst);
    18. bool STEmpty(ST* pst);
    19. int STSize(ST*pst);
    20. void STInit(ST* pst)
    21. {
    22. assert(pst);
    23. pst->a = NULL;//栈底
    24. //top不是下标
    25. pst->top = 0;//指向栈顶元素的下一个位置
    26. pst->capacity = 0;
    27. }
    28. void STDestroy(ST* pst)
    29. {
    30. assert(pst);
    31. free(pst->a);
    32. pst->a = NULL;
    33. }
    34. void STPush(ST* pst,STDataType x)
    35. {
    36. if (pst->top == pst->capacity)
    37. {
    38. int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
    39. STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * sizeof(STDataType));
    40. if (tmp == NULL)
    41. {
    42. perror("realloc fail");
    43. return;
    44. }
    45. pst->a = tmp;//返回的是realloc出来的内存块的地址
    46. pst->capacity = newCapacity;//把扩容后的空间大小赋值给栈容量
    47. }
    48. pst->a[pst->top] = x;//先放值
    49. pst->top++;//++
    50. }
    51. void STPop(ST* pst)
    52. {
    53. assert(pst);
    54. assert(!STEmpty(pst));
    55. pst->top--;
    56. }
    57. STDataType STTop(ST* pst)
    58. {
    59. assert(pst);
    60. assert(!STEmpty(pst));
    61. return pst->a[pst->top - 1];
    62. }
    63. bool STEmpty(ST* pst)//栈为空返回true,不为空返回false
    64. {
    65. //assert(pst);
    66. //if (pst->top == 0)
    67. //{
    68. // return true;
    69. //}
    70. //else
    71. //{
    72. // return false;
    73. //}
    74. return pst->top == 0;
    75. }
    76. int STSize(ST* pst)
    77. {
    78. assert(pst);
    79. return pst->top;
    80. }

    3.问题题解        

    s指向的是右括号,top存储的是左括号st(栈顶指针)a(栈底指针)

    1. 只要有一次不对应的情况,那么程序直接返回false
    2. 字符串遍历结束,若栈不为空,直接返回false
    3. 在比较过程中,若遇到栈为空,可是此时字符串未遍历完,直接返回false

    第一种情况:左括号多余

    第二种情况:括号没有多余,但是类型匹配不上

    第三种情况:右括号多余

    代码实现:

    1. bool isValid(char * s){
    2. ST st;
    3. STInit(&st);
    4. while(*s)//*s就是输入的那个x的值
    5. {
    6. //1.左括号入栈
    7. if(*s == '(' || *s == '[' || *s == '{')
    8. {
    9. STPush(&st, *s);
    10. }
    11. else
    12. {
    13. if(STEmpty(&st))//栈为空也需要销毁,因为它malloc了空间,空间在那占用着,只是数据没填进去
    14. {
    15. STDestroy(&st);
    16. return false;
    17. }
    18. //右括号出栈匹配
    19. char top=STTop(&st);
    20. STPop(&st);
    21. //只要有一个不匹配,直接返回false
    22. //左括号和右括号相等说明不了问题,只能说明这一次,这一对括号匹配,还有其它括号不匹配的
    23. //所以要找到不继续的条件
    24. if((*s == ']' && top!= '[')
    25. ||(*s == ')'&& top !='(')
    26. ||(*s=='}' && top!='{'))
    27. {
    28. STDestroy(&st);
    29. return false;
    30. }
    31. }
    32. ++s;//字符指针的移动
    33. }
    34. bool ret=STEmpty(&st);//栈不为空那就是false
    35. STDestroy(&st);
    36. return ret;
    37. }

    代码执行:

            本文结束,若有错误,欢迎改正,谢谢支持!

  • 相关阅读:
    生物通路数据库收录1600+整合的经典通路
    @企业主们看过来,用华为云CDN给你的网页加个速
    C++模板详解
    模电|PN结及其单向导电性
    如何实现MATLAB与Simulink的数据交互
    Spring-Java
    【ACM】HOJ水题(7)
    vue框架学习 -- 跨域问题解决之 proxy 配置
    一文理解Hadoop分布式存储和计算框架入门基础
    influxdb2的使用
  • 原文地址:https://blog.csdn.net/weixin_65186652/article/details/132829507