• 【数据结构与算法】<==>栈


    作者:旧梦拾遗186

    专栏:数据结构成长日记

     

    每日励志

    没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。

    前言:

    栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO Last In First Out )的原则。
    压栈:栈的插入操作叫做进栈 / 压栈 / 入栈, 入数据在栈顶
    出栈:栈的删除操作叫做出栈。 出数据也在栈顶

    目录

    栈的概念及结构

    栈的实现

    test.c

    Stack.c

    Stack.h

    测试

    栈的OJ题

     


    栈的概念及结构

    栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO Last In First Out )的原则。
    压栈:栈的插入操作叫做进栈 / 压栈 / 入栈, 入数据在栈顶
    出栈:栈的删除操作叫做出栈。 出数据也在栈顶

     

     

     

     

    理解了栈的概念及其结构,我们可以连做一些比较常见的选择题:

    1.一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出
    栈的顺序是( )。
    A 12345ABCDE
    B EDCBA54321
    C ABCDE12345
    D 54321EDCBA

    解析:非常简单,根据后进先出,选B

    2.若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()
    A 1,4,3,2
    B 2,3,4,1
    C 3,1,4,2
    D 3,4,2,1

    解析:学校的考试选择题最喜欢出这种了,我们可以边进边出,A、B、D是可以的。而对于C:要想出3,肯定要先入1、2、3,而要出1是不可能的,还有个2呢。


    栈的实现

    栈的实现一般可以使用 数组或者链表实现 ,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的 代价比较小。

     

     

     

     注意:

    • 栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

    • 栈的作用还是挺大的:递归如果深度太深,可以利用栈来实现非递归

    • 我们直接来进行栈的实现:数据结构这里不要直接去访问结构数据,我们最好还是通过函数接口进行访问

    对于栈的插入操作,我们需要知道top的初始位置是在哪里,是-1呢还是0呢?

     

     

    很明显,这里我们在初始化的时候设置成0了。同时,插入的时候我们需要去考虑有必要扩容的问题。

    1. void Stackpush(ST* ps, STDataType x)
    2. {
    3. assert(ps);
    4. if (ps->top == ps->capaticy)
    5. {
    6. int newcapaticy =ps->capaticy== 0 ? 4 : ps->capaticy * 2;
    7. STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapaticy);
    8. if (tmp == NULL)
    9. {
    10. perror("false");
    11. exit(-1);
    12. }
    13. ps->a = tmp;
    14. ps->capaticy = newcapaticy;
    15. }
    16. ps->a[ps->top] = x;
    17. ps->top++;
    18. }

     

    test.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include"Stack.h"
    3. void TestStack()
    4. {
    5. ST st;
    6. StackInit(&st);
    7. Stackpush(&st, 1);
    8. Stackpush(&st, 2);
    9. Stackpush(&st, 3);
    10. Stackpush(&st, 4);
    11. Stackpush(&st, 5);
    12. //访问栈
    13. while (!StackEmpty(&st))
    14. {
    15. printf("<==>%d ", StackTop(&st));
    16. Stackpop(&st);
    17. }
    18. //把栈顶数据拿出来
    19. printf("\n");
    20. }
    21. int main()
    22. {
    23. TestStack();
    24. return 0;
    25. }

     

    Stack.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include"Stack.h"
    3. //初始化
    4. void StackInit(ST* ps)
    5. {
    6. assert(ps);
    7. ps->capaticy = ps->top = 0;
    8. ps->a = NULL;
    9. }
    10. //销毁
    11. void StackDestory(ST* ps)
    12. {
    13. assert(ps);
    14. free(ps->a);
    15. ps->a = NULL;
    16. ps->capaticy = ps->top = 0;
    17. }
    18. void Stackpush(ST* ps, STDataType x)
    19. {
    20. assert(ps);
    21. if (ps->top == ps->capaticy)
    22. {
    23. int newcapaticy =ps->capaticy== 0 ? 4 : ps->capaticy * 2;
    24. STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapaticy);
    25. if (tmp == NULL)
    26. {
    27. perror("false");
    28. exit(-1);
    29. }
    30. ps->a = tmp;
    31. ps->capaticy = newcapaticy;
    32. }
    33. ps->a[ps->top] = x;
    34. ps->top++;
    35. }
    36. 打印
    37. //void Stackprint(ST* ps)
    38. //{
    39. // assert(ps);
    40. // ps->top = 0;
    41. // while (ps->top!=ps->capaticy)
    42. // {
    43. // printf("<==>%d", ps->a[ps->top]);
    44. // ps->top++;
    45. // }
    46. //}
    47. //退栈
    48. void Stackpop(ST* ps)
    49. {
    50. assert(ps);
    51. assert(!StackEmpty(ps));
    52. ps->top--;
    53. }
    54. //判断栈空
    55. bool StackEmpty(ST* ps)
    56. {
    57. assert(ps);
    58. return ps->top == 0;
    59. }
    60. STDataType StackTop(ST* ps)
    61. {
    62. assert(ps);
    63. assert(!StackEmpty(ps));
    64. return ps->a[ps->top - 1];
    65. }
    66. int StackSize(ST* ps)
    67. {
    68. assert(ps);
    69. return ps->top;

     

     

     

    Stack.h

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #pragma once
    3. #include
    4. #include
    5. #include
    6. #include
    7. typedef int STDataType;
    8. typedef struct Stack
    9. {
    10. STDataType* a;
    11. int top;
    12. int capaticy;
    13. }ST;
    14. //初始化
    15. void StackInit(ST* ps);
    16. //销毁
    17. void StackDestory(ST* ps);
    18. //插入数据
    19. void Stackpush(ST* ps, STDataType x);
    20. 打印
    21. //void Stackprint(ST* ps);
    22. //退栈
    23. void Stackpop(ST* ps);
    24. //判断栈空
    25. bool StackEmpty(ST* ps);
    26. //查看栈顶
    27. STDataType StackTop(ST* ps);
    28. //元素个数
    29. int StackSize(ST* ps);

     

    测试

    栈的OJ题

    20. 有效的括号icon-default.png?t=M666https://leetcode.cn/problems/valid-parentheses/

     

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

    有效字符串需满足:

    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
     

    示例 1:

    输入:s = "()"
    输出:true
    示例 2:

    输入:s = "()[]{}"
    输出:true
    示例 3:

    输入:s = "(]"
    输出:false
    示例 4:

    输入:s = "([)]"
    输出:false
    示例 5:

    输入:s = "{[]}"
    输出:true
     

    提示:

    1 <= s.length <= 104
    s 仅由括号 '()[]{}' 组成

    1. #include
    2. #include
    3. #include
    4. #include
    5. //静态栈
    6. //#define N 100
    7. //typedef int STDataType;
    8. //typedef struct Stack
    9. //{
    10. // STDataType a[N];
    11. // int top;
    12. //}ST;
    13. //动态栈
    14. typedef char STDataType;
    15. typedef struct Stack
    16. {
    17. STDataType*a;
    18. int top;
    19. int capacity;
    20. }ST;
    21. void StackInit(ST* ps);
    22. void StackDestory(ST* ps);
    23. void StackPush(ST* ps,STDataType x);
    24. void StackPop(ST* ps);
    25. STDataType StackTop(ST* ps);
    26. bool StackEmpty(ST*ps);
    27. int StackSize(ST* ps);
    28. void StackInit(ST* ps)
    29. {
    30. assert(ps);
    31. ps->a = NULL;
    32. ps->capacity = ps->top = 0;
    33. }
    34. void StackDestory(ST* ps)
    35. {
    36. assert(ps);
    37. free(ps->a);
    38. ps->a = NULL;
    39. ps->capacity = ps->top = 0;
    40. }
    41. void StackPush(ST* ps, STDataType x)
    42. {
    43. assert(ps);
    44. if (ps->top == ps->capacity)
    45. {
    46. int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
    47. STDataType* tmp = (STDataType*)realloc(ps->a, newCapacity * sizeof(STDataType));
    48. if (NULL == tmp)
    49. {
    50. perror("malloc fail");
    51. exit(-1);
    52. }
    53. ps->a = tmp;
    54. ps->capacity = newCapacity;
    55. }
    56. ps->a[ps->top] = x;
    57. ps->top++;
    58. }
    59. void StackPop(ST* ps)
    60. {
    61. assert(ps);
    62. assert(!StackEmpty(ps));
    63. ps->top--;
    64. }
    65. STDataType StackTop(ST* ps)
    66. {
    67. assert(ps);
    68. assert(!StackEmpty(ps));
    69. return ps->a[ps->top - 1];
    70. }
    71. bool StackEmpty(ST* ps)
    72. {
    73. assert(ps);
    74. return ps->top == 0;
    75. }
    76. int StackSize(ST* ps)
    77. {
    78. assert(ps);
    79. return ps->top;
    80. }
    81. bool isValid(char * s){
    82. ST st;
    83. StackInit(&st);
    84. while(*s)
    85. {
    86. if(*s == '{' || *s=='[' ||*s=='(')
    87. {
    88. StackPush(&st,*s);
    89. }
    90. else
    91. {
    92. //可能只有右括号,而栈为空,数量不匹配
    93. if(StackEmpty(&st))
    94. return false;
    95. char top = StackTop(&st);
    96. StackPop(&st);
    97. if((*s == '}'&&top != '{')
    98. ||(*s == ']'&&top != '[')
    99. ||(*s == ')'&&top != '('))
    100. {
    101. return false;
    102. }
    103. }
    104. ++s;
    105. }
    106. //栈不为空,数量不匹配
    107. bool flag = StackEmpty(&st);
    108. StackDestory(&st);
    109. return flag;
    110. }

     

     

     

     

  • 相关阅读:
    reportlab 生成pdf文件 (python)
    Go语言的100个错误使用场景(40-47)|字符串&函数&方法
    【Redis设计与实现】第一部分 :Redis数据结构和对象 总结
    企业电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理
    揭秘报表新玩法!标配插件不再单调,如何用柱形图插件让你的报表瞬间高大上!
    力扣------两数之和
    如何将jpg转化为png?
    解决STM32F429烧录程序后还需复位才能植入程序的bug
    Guava Cache 异步刷新技巧,你值得拥有!
    人工智能、深度学习、机器学习常见面试题321~324
  • 原文地址:https://blog.csdn.net/weixin_67900732/article/details/126278859