• [C语言 数据结构] 栈


    1.什么是栈?

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

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

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

    我们可以把它看作一个像桶,我们放东西进去一定在桶的顶端,而我们直接拿出桶中的东西也是从顶端拿取。、

    2.栈的实现

    (声明:C语言的数据结构就是手搓呗,虽然效率低了一点,但是强烈建议大家一起搓一遍,能很好的帮大家理解数据结构的同时,对动态内存管理,指针的理解都有好处)

    简单认识了一下栈之后呢我们开始着手实现栈的功能:

    栈的实现一般可以使用数组或者链表实现,链表相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。(链表不用移动元素,程序的时间复杂度会大大降低)

    好了,接下来大家就看着这个头文件搓起来吧。

    1. // 下面是定长的静态栈的结构,实际中一般不实用,所以我们主要实现下面的支持动态增长的栈
    2. /*
    3. typedef int STDataType;
    4. #define N 10
    5. typedef struct Stack
    6. {
    7. STDataType _a[N];
    8. int _top; // 栈顶
    9. }Stack;
    10. */
    11. // 支持动态增长的栈
    12. typedef int STDataType;
    13. typedef struct Stack
    14. {
    15. STDataType* _a;
    16. int _top; // 栈顶
    17. int _capacity; // 容量
    18. }Stack;
    19. // 初始化栈
    20. void StackInit(Stack* ps);
    21. // 入栈
    22. void StackPush(Stack* ps, STDataType data);
    23. // 出栈
    24. void StackPop(Stack* ps);
    25. // 获取栈顶元素
    26. STDataType StackTop(Stack* ps);
    27. // 获取栈中有效元素个数
    28. int StackSize(Stack* ps);
    29. // 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
    30. int StackEmpty(Stack* ps);
    31. // 销毁栈
    32. void StackDestroy(Stack* ps);

    以下是我写的,大家可以用作参考

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include"Stack.h"
    3. void StackInit(Stack* ps)
    4. {
    5. assert(ps);
    6. ps->_a = NULL;
    7. ps->_capacity = 0;
    8. ps->_top = 0;
    9. }
    10. // 入栈
    11. void StackPush(Stack* ps, STDataType data) {
    12. assert(ps);
    13. //判断是否扩容
    14. if (ps->_capacity == ps->_top) {
    15. int newCapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;
    16. Stack* tmp = (Stack*)realloc(ps->_a, sizeof(Stack) * newCapacity);
    17. assert(tmp);
    18. ps->_a = tmp;
    19. }
    20. //加上新数据
    21. ps->_a[ps->_top] = data;
    22. ps->_top++;
    23. }
    24. // 出栈
    25. void StackPop(Stack* ps) {
    26. assert(ps);
    27. assert(ps->_top);
    28. ps->_top--;
    29. }
    30. // 获取栈顶元素
    31. STDataType StackTop(Stack* ps) {
    32. assert(ps);
    33. assert(ps->_top);
    34. return ps->_a[ps->_top-1];
    35. }
    36. // 获取栈中有效元素个数
    37. int StackSize(Stack* ps) {
    38. return ps->_top;
    39. }
    40. // 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
    41. int StackEmpty(Stack* ps) {
    42. assert(ps);
    43. if (ps->_top) {
    44. return 0;
    45. }
    46. else {
    47. return 1;
    48. }
    49. }
    50. // 销毁栈
    51. void StackDestroy(Stack* ps) {
    52. assert(ps);
    53. if (ps->_a) {
    54. free(ps->_a);
    55. }
    56. return;
    57. }

  • 相关阅读:
    门面设计模式
    NodeJS开发环境搭建
    DC-DC——同步和异步的区别
    自动化运维场景在数据中心的落地之网络策略自动化管理-人保科技
    C++入门教程(十一、宏)
    mysql5.7的安装
    leetcode第362场周赛
    【数据结构】图—图的存储结构(邻接矩阵法、邻接表法、邻接多重法、十字链表法)
    mysql联合索引和最左匹配问题。
    SAP和APS系统订单BOM核对(SAP配置BOM攻略九)
  • 原文地址:https://blog.csdn.net/2301_79175236/article/details/134446906