• 【C++】栈~~(很详细哦)


    在前几天,我们刚一起学过顺序表,链表(无头单向不循环,有头双向循环),这两种都属于线性表因为是一系列存储的。而以后的哈希表则是散列表

    今天我们看一下栈

    目录

    1.栈的介绍

    2.实现

    3.题目 


    1.栈的介绍

    栈,又叫做栈帧,也是一种数据结构(和顺序表链表一样),但是他自己的结构也有一些特殊的地方

     他是这样的,我们把底部叫做栈底,顶部叫做栈顶,通俗易懂对吧,但是他有一个小规则,只能从栈顶存储或者销毁数据,如果现在有一个空栈,那么存储删除数据就是下面这样的 

     永远不可能从栈底拿出数据,没有为什么~~

    或者你也可以总结成LIFO原则(last in first out)即后进先出

    2.实现

    不难发现,其实他的结构和之前学过的顺序表 链表很相似,我们已经写过两个了,这个可不可以仿照着写呢?那模仿哪一个更好?

    分析一下啦

    首先他不存在不连续存储的问题,在这点上其实二者(顺序表,链表)都行,但是既然都连续存储了还是顺序表更方便一下,不需要指针指来指去

    其次最好可以很方便的访问数据,而且能快速进行一个位置(栈顶或者栈底)的增删,因为栈的结构就决定他只需要一个位置增删就可以,那就是顺序表的下标访问最合适不过了~~~

    所以我们采取顺序表的写法来写栈

    对于顺序表不了解的同学赶紧去看看我的顺序表那篇文章在下面

    顺序表在这里

     头文件

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include
    6. typedef int type;
    7. typedef struct Stack
    8. {
    9. type *a;
    10. int top;// 初始化成0 表示栈顶位置下一个位置的下标
    11. int capacity;
    12. }ST;
    13. void InitST(ST* p);//初始化
    14. void PushST(ST* p,type x);//在栈顶压数据
    15. void PopST(ST* p);//从栈顶删除数据
    16. void DestoryST(ST* p);//销毁栈
    17. bool Empty(ST* p);//判断栈是不是空
    18. type StackTop(ST* p);//显示栈顶的数据
    19. type SizeST(ST* p);//栈里面数据的个数

    实现

    1. #include "stack.h"
    2. void InitST(ST* p)//初始化
    3. {
    4. type* tmp = (type*)malloc(sizeof(type)*4);
    5. if (tmp == NULL)
    6. {
    7. perror("InitST");
    8. exit(-1);
    9. }
    10. p->a = tmp;
    11. p->capacity = 4;
    12. p->top = 0;
    13. }
    14. void PushST(ST* p, type x)//在栈顶压数据
    15. {
    16. if (p->capacity == p->top)//表示需要扩容
    17. {
    18. ST* tmp = (ST*)realloc(p->a, p->capacity* 2*sizeof(type));
    19. if (tmp == NULL)
    20. {
    21. perror("realloc");
    22. exit(-1);
    23. }
    24. p->a = tmp;
    25. p->capacity *= 2;
    26. }
    27. p->a[p->top] = x;
    28. p->top++;
    29. }
    30. void PopST(ST* p)//从栈顶删除数据
    31. {
    32. assert(p);
    33. assert(!Empty(p));
    34. p->top--;
    35. }
    36. void DestoryST(ST* p)//销毁栈
    37. {
    38. assert(p);
    39. free(p->a);
    40. p->a = NULL;
    41. p->capacity = p->top = 0;
    42. }
    43. bool Empty(ST* p)//判断栈是不是空
    44. {
    45. assert(p);
    46. return p->top == 0;
    47. }
    48. type StackTop(ST* p)//显示栈顶的数据
    49. {
    50. assert(p);
    51. assert(!Empty(p));
    52. return p->a[p->top - 1];
    53. }
    54. type SizeST(ST* p)//栈里面数据的个数
    55. {
    56. assert(p);
    57. return p->top;
    58. }

    3.题目

    有效括号(典中典)

    题目在这里大家先自己做一下

    我们用C语言写一下,其实就是匹配的问题,如果都是左括号比如(,{,【,这些都是要压栈的,不需要遍历到结束再去判断是否匹配的问题,只要遇到右括号就及时匹配就好了

    因为是C语言写的所以需要在前面把我们写的栈带上

    1. typedef int type;
    2. typedef struct Stack
    3. {
    4. type *a;
    5. int top;// 初始化成0 表示栈顶位置下一个位置的下标
    6. int capacity;
    7. }ST;
    8. bool Empty(ST* p)//判断栈是不是空
    9. {
    10. assert(p);
    11. return p->top == 0;
    12. }
    13. void InitST(ST* p)
    14. {
    15. type* tmp = (type*)malloc(sizeof(type)*4);
    16. if (tmp == NULL)
    17. {
    18. perror("InitST");
    19. exit(-1);
    20. }
    21. p->a = tmp;
    22. p->capacity = 4;
    23. p->top = 0;
    24. }
    25. void PushST(ST* p, type x)//在栈顶压数据
    26. {
    27. if (p->capacity == p->top)//表示需要扩容
    28. {
    29. type* tmp = (type*)realloc(p->a, p->capacity* 2*sizeof(type));
    30. if (tmp == NULL)
    31. {
    32. perror("realloc");
    33. exit(-1);
    34. }
    35. p->a = tmp;
    36. p->capacity *= 2;
    37. }
    38. p->a[p->top] = x;
    39. p->top++;
    40. }
    41. void PopST(ST* p)//从栈顶删除数据
    42. {
    43. assert(p);
    44. assert(!Empty(p));
    45. p->top--;
    46. }
    47. void DestoryST(ST* p)//销毁栈
    48. {
    49. assert(p);
    50. free(p->a);
    51. p->a = NULL;
    52. p->capacity = p->top = 0;
    53. }
    54. type StackTop(ST* p)//显示栈顶的数据
    55. {
    56. assert(p);
    57. assert(!Empty(p));
    58. return p->a[p->top - 1];
    59. }
    60. bool isValid(char * s){
    61. ST st;
    62. InitST(&st);
    63. while(*s)
    64. {
    65. if(*s=='(' || *s=='[' || *s=='{')
    66. {
    67. PushST(&st,*s);
    68. ++s;
    69. }
    70. else
    71. {
    72. if(Empty(&st))
    73. {
    74. DestoryST(&st);
    75. return false;
    76. }
    77. char top=StackTop(&st);
    78. PopST(&st);
    79. if((*s==')'&& top!='(' )||(*s==']'&& top!='[' )||( *s=='}'&&top!='{'))
    80. {
    81. DestoryST(&st);
    82. return false;
    83. }
    84. else{
    85. s++;
    86. }
    87. }
    88. }
    89. bool ret=Empty(&st);
    90. DestoryST(&st);
    91. return ret;
    92. }


    大家学会了吗~~~ 

  • 相关阅读:
    自动化工具
    【C语言】文件操作(二)
    二维码智慧门牌管理系统:提升社会治理水平,创新市民服务方式
    2018年java进阶需要关注的公众号
    网络安全(黑客)自学
    设置你的第一个React应用
    LeetCode高频题78. 子集,返回该数组所有可能的子集(幂集),生成所有的子序列
    分布式搜索引擎Elasticsearch中各种类型节点的作用
    C++ 友元函数和友元类
    天龙八部科举答题问题和答案(全7/8)
  • 原文地址:https://blog.csdn.net/weixin_71138261/article/details/127775097