• 数据结构之栈的实现(附源码)


    目录

    一、栈的概念及结构

    ​二、栈的实现

    三、初学栈的练习题


    一、栈的概念及结构

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

    压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶

    出栈:栈的删除操作叫做出栈。出数据也在栈顶。

    二、栈的实现

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


     

    具体实现代码如下:

    1. #pragma once
    2. //Stack.h
    3. #include
    4. #include
    5. #include
    6. // 支持动态增长的栈
    7. //使用数组实现
    8. typedef int STDataType;
    9. typedef struct Stack
    10. {
    11. STDataType* _a;
    12. int _top; // 栈顶
    13. int _capacity; // 容量
    14. }Stack;
    15. // 初始化栈
    16. void StackInit(Stack* ps);
    17. // 入栈
    18. void StackPush(Stack* ps, STDataType data);
    19. // 出栈
    20. void StackPop(Stack* ps);
    21. // 获取栈顶元素
    22. STDataType StackTop(Stack* ps);
    23. // 获取栈中有效元素个数
    24. int StackSize(Stack* ps);
    25. // 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
    26. int StackEmpty(Stack* ps);
    27. // 销毁栈
    28. void StackDestroy(Stack* ps);
    1. //Stack.c
    2. #include "Stack.h"
    3. void StackInit(Stack* ps)
    4. {
    5. assert(ps);
    6. ps->_a = NULL;
    7. ps->_top = 0;
    8. ps->_capacity = 0;
    9. }
    10. void StackPush(Stack* ps, STDataType data)
    11. {
    12. assert(ps);
    13. //容量满了
    14. if (ps->_capacity == ps->_top)
    15. {
    16. //如果数组的容量为0,就赋值为4,;如果数组的容量不为0且容量满了,就扩大为原来容量的二倍。
    17. int newCapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;
    18. STDataType* tmp = (STDataType*)realloc(ps->_a,sizeof(STDataType) * newCapacity);
    19. if (tmp == NULL)
    20. {
    21. perror("realloc fail");
    22. exit(-1);
    23. }
    24. ps->_a = tmp;
    25. ps->_capacity = newCapacity;
    26. }
    27. ps->_a[ps->_top] = data;
    28. ps->_top++;
    29. }
    30. void StackPop(Stack* ps)
    31. {
    32. assert(ps);
    33. assert(ps->_top > 0);
    34. ps->_top--;
    35. }
    36. STDataType StackTop(Stack* ps)
    37. {
    38. assert(ps);
    39. assert(ps->_top > 0);
    40. return ps->_a[ps->_top - 1];
    41. }
    42. int StackSize(Stack* ps)
    43. {
    44. assert(ps);
    45. return ps->_top;
    46. }
    47. int StackEmpty(Stack* ps)
    48. {
    49. return ps->_top;
    50. }
    51. void StackDestroy(Stack* ps)
    52. {
    53. assert(ps);
    54. free(ps->_a);
    55. ps->_a = NULL;
    56. ps->_capacity = 0;
    57. ps->_top = 0;
    58. }
    1. test.c
    2. #include "Stack.h"
    3. void test01()
    4. {
    5. Stack 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. while (StackEmpty(&st))
    13. {
    14. printf("%d ", StackTop(&st));
    15. StackPop(&st);
    16. }
    17. printf("\n");
    18. StackDestroy(&st);
    19. }
    20. int main()
    21. {
    22. test01();
    23. return 0;
    24. }

    三、初学栈的练习题

    题1:

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

    有效字符串需满足:

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

     思路:当输入的字符串中出现左括号时就进栈,出现右括号时就与栈顶的左括号看是否相匹配。若相匹配就栈顶的左括号出栈,不匹配就直接返回false。若所有左右括号都匹配才返回true。

    具体实现代码如下(C语言实现):

    1. //C语言实现需要自己将栈的各个功能实现
    2. typedef char STDataType;
    3. typedef struct Stack
    4. {
    5. STDataType* _a;
    6. int _top; // 栈顶
    7. int _capacity; // 容量
    8. }Stack;
    9. void StackInit(Stack* ps)
    10. {
    11. assert(ps);
    12. ps->_a = NULL;
    13. ps->_top = 0;
    14. ps->_capacity = 0;
    15. }
    16. void StackPush(Stack* ps, STDataType data)
    17. {
    18. assert(ps);
    19. if (ps->_capacity == ps->_top)
    20. {
    21. int newCapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;
    22. STDataType* tmp = (STDataType*)realloc(ps->_a,sizeof(STDataType) * newCapacity);
    23. if (tmp == NULL)
    24. {
    25. perror("realloc fail");
    26. exit(-1);
    27. }
    28. ps->_a = tmp;
    29. ps->_capacity = newCapacity;
    30. }
    31. ps->_a[ps->_top] = data;
    32. ps->_top++;
    33. }
    34. void StackPop(Stack* ps)
    35. {
    36. assert(ps);
    37. assert(ps->_top > 0);
    38. ps->_top--;
    39. }
    40. STDataType StackTop(Stack* ps)
    41. {
    42. assert(ps);
    43. assert(ps->_top > 0);
    44. return ps->_a[ps->_top - 1];
    45. }
    46. int StackSize(Stack* ps)
    47. {
    48. assert(ps);
    49. return ps->_top;
    50. }
    51. int StackEmpty(Stack* ps)
    52. {
    53. return ps->_top;
    54. }
    55. void StackDestroy(Stack* ps)
    56. {
    57. assert(ps);
    58. free(ps->_a);
    59. ps->_a = NULL;
    60. ps->_capacity = 0;
    61. ps->_top = 0;
    62. }
    63. bool isValid(char * s)
    64. {
    65. Stack st;
    66. StackInit(&st);
    67. char topVal;
    68. while(*s)
    69. {
    70. //左括号入栈
    71. if(*s == '(' || *s == '[' || *s == '{')
    72. {
    73. StackPush(&st, *s);
    74. }
    75. //右括号与栈顶左括号进行匹配
    76. else
    77. {
    78. //栈里已经没有左括号了,再输入一个右括号,不匹配。
    79. if(StackEmpty(&st) == 0)
    80. {
    81. StackDestroy(&st);
    82. return false;
    83. }
    84. topVal = StackTop(&st);
    85. //不匹配返回false。
    86. if((topVal == '(' && *s != ')') || (topVal == '[' && *s != ']')
    87. || (topVal == '{' && *s != '}'))
    88. {
    89. StackDestroy(&st);
    90. return false;
    91. }
    92. //匹配成功栈顶出栈。
    93. StackPop(&st);
    94. }
    95. s++;
    96. }
    97. //最后栈里还剩有左括号返回false,不剩返回true。
    98. int ret = StackEmpty(&st);
    99. if(ret == 0)
    100. return true;
    101. else
    102. return false;
    103. }


     

  • 相关阅读:
    【问题记录】防止mimikatz获取到明文密码
    Win10升级Win11必备的5款免费软件
    《优化接口设计的思路》系列:第六篇—接口防抖(防重复提交)的一些方式
    【Java Web】CSS
    贪心算法解决多机调度问题——C++实现
    ShardingSphere-proxy-5.0.0企业级分库分表、读写分离、负载均衡、雪花算法、取模算法整合(八)
    uniapp pc端和移动端列表上拉刷新加载分页
    学习使用jquery操作修改select下拉取值和设置选中的方法整理
    DAY33 1005. K次取反后最大化的数组和 + 134. 加油站 + 135. 分发糖果
    信息系统项目管理-IT治理与IT审计
  • 原文地址:https://blog.csdn.net/m0_74265792/article/details/132766094