• 深度解剖数据在栈中的应用


    > 作者简介:დ旧言~,目前大一,现在学习Java,c,c++,Python等
    > 座右铭:松树千年终是朽,槿花一日自为荣。
    > 望小伙伴们点赞👍收藏✨加关注哟💕💕 

     🌟前言       

            前面我们已经学习了顺序表和链表,他们无法控制数据的打印,而栈一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。今天我们来实现一下--《栈》。

    🌙主体

    这里我们这里需知道栈的简单知识

    压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
    出栈:栈的删除操作叫做出栈。出数据也在栈顶。

    咱们从两个方面实现栈,动态管理,对元素进行操作。

    在程序中为了实现栈,需要创建头文件Stact.h ,创建源文件Test.c,Stack.c。

     🌠动态管理

    💤初始化动态栈

    💦1.因为咱们的栈是以数组的形式存储则需要开辟空间

    💦2.定义一个数组指针来存储数据

    💦3.定义栈顶

    1.首先我们在Stact.h定义动态的栈,省得我们再调用(栈),这里和顺序表是一样哒。

    1. //定义数据类型
    2. typedef int STDataType;
    3. //定义栈
    4. typedef struct Stack
    5. {
    6. //定义数组
    7. STDataType* a;
    8. //栈顶
    9. int top;
    10. //初始容量
    11. int capacity;
    12. }ST;

    2.对栈进行初始化

    实现这个函数那简直就是信手拈来,不会的打手手

    1. //初始化
    2. void STInit(ST* ps)
    3. {
    4. //断言
    5. assert(ps);
    6. //初始化
    7. ps->a = NULL;
    8. ps->capacity = 0;
    9. ps->top = 0;
    10. }

     💤释放栈内存

    实现这个函数只需要释放ps->a内存,其它值为零

    1. //销毁
    2. void STDestroy(ST* ps)
    3. {
    4. //断言
    5. assert(ps);
    6. //释放内存
    7. free(ps->a);
    8. //置空
    9. ps->a = NULL;
    10. ps->top = ps->capacity = 0;
    11. }

      🌠对元素进行操作

     💤添加元素

    💦1.当开辟的空间等于栈顶则需要扩容

    💦2.因为这里是后进先出所以把元素放在栈顶

    💦3.再top++

    1. //添加元素
    2. void STPush(ST* ps, STDataType x)
    3. {
    4. //断言
    5. assert(ps);
    6. //当空间不足时需要开辟空间
    7. if (ps->top == ps->capacity)
    8. {
    9. //扩容
    10. int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
    11. //开辟空间
    12. STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);
    13. //判断
    14. if (tmp == NULL)
    15. {
    16. perror("realloc fail");
    17. exit(-1);
    18. }
    19. //赋值
    20. ps->a = tmp;
    21. ps->capacity = newCapacity;
    22. }
    23. //放元素进栈
    24. ps->a[ps->top] = x;
    25. ps->top++;
    26. }

     💤释放元素(出栈)

    这里遵循后进先出就行。

    1. //释放元素(出栈)
    2. void STPop(ST* ps)
    3. {
    4. //断言(栈中不能为空)
    5. assert(ps);
    6. //栈指针需要大于零
    7. assert(ps->top > 0);
    8. //元素减一
    9. --ps->top;
    10. }

     💤剥离元素

           既然是剥离元素,因此需要返回值,因为以数组的形式存储,所以需要下标ps->top - 1,遵循先进先出。

    1. //剥离元素
    2. STDataType STTop(ST* ps)
    3. {
    4. //断言(栈中不能为空)
    5. assert(ps);
    6. //栈指针需要大于零
    7. assert(ps->top > 0);
    8. //剥离元素
    9. return ps->a[ps->top - 1];
    10. }

     💤计算栈中元素个数

    写这个函数我觉得太小学生了。

    1. //计算栈中元素个数
    2. int STSize(ST* ps)
    3. {
    4. //断言
    5. assert(ps);
    6. //返回元素个数
    7. return ps->top;
    8. }

    🌙代码总结

    🌠主函数

    1. //包含文件
    2. #include"Stack.h"
    3. void TestStack1()
    4. {
    5. //初始化
    6. ST st;
    7. STInit(&st);
    8. STPush(&st, 1);
    9. STPush(&st, 2);
    10. STPush(&st, 3);
    11. STPush(&st, 4);
    12. STPush(&st, 5);
    13. while (!STEmpty(&st))
    14. {
    15. printf("%d ", STTop(&st));
    16. STPop(&st);
    17. }
    18. printf("\n");
    19. STDestroy(&st);
    20. }
    21. int main()
    22. {
    23. TestStack1();
    24. return 0;
    25. }

    🌠Stact.h头文件

    1. //包含头文件
    2. #include
    3. #include
    4. #include
    5. #include
    6. //定义数据类型
    7. typedef int STDataType;
    8. //定义栈
    9. typedef struct Stack
    10. {
    11. //定义数组
    12. STDataType* a;
    13. //栈顶
    14. int top;
    15. //初始容量
    16. int capacity;
    17. }ST;
    18. //初始化
    19. void STInit(ST* ps);
    20. //销毁
    21. void STDestroy(ST* ps);
    22. //添加元素
    23. void STPush(ST* ps, STDataType x);
    24. //释放元素(出栈)
    25. void STPop(ST* ps);
    26. //剥离元素
    27. STDataType STTop(ST* ps);
    28. //计算栈中元素个数
    29. int STSize(ST* ps);
    30. bool STEmpty(ST* ps);

    🌠Stack.c源文件

    1. //包含文件
    2. #include"Stack.h"
    3. //初始化
    4. void STInit(ST* ps)
    5. {
    6. //断言
    7. assert(ps);
    8. //初始化
    9. ps->a = NULL;
    10. ps->capacity = 0;
    11. ps->top = 0;
    12. }
    13. //销毁
    14. void STDestroy(ST* ps)
    15. {
    16. //断言
    17. assert(ps);
    18. //释放内存
    19. free(ps->a);
    20. //置空
    21. ps->a = NULL;
    22. ps->top = ps->capacity = 0;
    23. }
    24. //添加元素
    25. void STPush(ST* ps, STDataType x)
    26. {
    27. //断言
    28. assert(ps);
    29. //当空间不足时需要开辟空间
    30. if (ps->top == ps->capacity)
    31. {
    32. //扩容
    33. int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
    34. //开辟空间
    35. STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);
    36. //判断
    37. if (tmp == NULL)
    38. {
    39. perror("realloc fail");
    40. exit(-1);
    41. }
    42. //赋值
    43. ps->a = tmp;
    44. ps->capacity = newCapacity;
    45. }
    46. //放元素进栈
    47. ps->a[ps->top] = x;
    48. ps->top++;
    49. }
    50. //释放元素(出栈)
    51. void STPop(ST* ps)
    52. {
    53. //断言(栈中不能为空)
    54. assert(ps);
    55. //栈指针需要大于零
    56. assert(ps->top > 0);
    57. //元素减一
    58. --ps->top;
    59. }
    60. //剥离元素
    61. STDataType STTop(ST* ps)
    62. {
    63. //断言(栈中不能为空)
    64. assert(ps);
    65. //栈指针需要大于零
    66. assert(ps->top > 0);
    67. //剥离元素
    68. return ps->a[ps->top - 1];
    69. }
    70. //计算栈中元素个数
    71. int STSize(ST* ps)
    72. {
    73. //断言
    74. assert(ps);
    75. //返回元素个数
    76. return ps->top;
    77. }
    78. //判断栈中是否还有元素
    79. bool STEmpty(ST* ps)
    80. {
    81. //断言
    82. assert(ps);
    83. //返回值
    84. return ps->top == 0;
    85. }

    🌟结束语

           今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

  • 相关阅读:
    Java 中的设计模式
    鸿蒙DevEco Studio 4.1 Release-模拟器启动方式错误
    [附源码]计算机毕业设计贵港高铁站志愿者服务平台
    【RocketMQ生产者发送消息的三种方式:发送同步消息、异步消息、单向消息&案例实战&详细学习流程】
    notepad++去除每一行第二个等号之后的内容解决ResolvePackageNotFound
    Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片,Kotlin
    全职RISC-V芯片D1开发板使用adb串口COM连接设备和文件上传下载
    初学phar反序列化
    linux系统设置密钥登录
    六、基础算法精讲:二叉树与递归
  • 原文地址:https://blog.csdn.net/AAlykk/article/details/132953300