• 数据结构——栈


    栈是一种特殊的线性表,在固定的一端进行插入和删除,这端也成为栈顶,而不能进行插入删除的一端叫做栈底。 

    声明

    1. typedef int STDatatype;
    2. typedef struct Stack
    3. {
    4. STDatatype* a;
    5. int capacity;
    6. int top;
    7. }ST;

     初始化

    1. void StackInit(ST* ps)
    2. {
    3. //不初始化空间
    4. /*ps->a = NULL;
    5. ps->top = 0;
    6. ps->capacity = 0;*/
    7. //初始化空间
    8. ps->a = (STDatatype*)malloc(sizeof(STDatatype) * 4);
    9. if (ps->a == NULL)
    10. {
    11. perror("malloc");
    12. exit(-1);
    13. }
    14. ps->top = 0;
    15. ps->capacity = 4;
    16. }

    Push

    入栈,往栈里存放数据。

    检查空间

    1. static void check_capacity(ST* ps)
    2. {
    3. if (ps->top == ps->capacity)
    4. {
    5. int newCapacity = ps->capacity * 2;
    6. STDatatype* tmp = (STDatatype*)realloc(ps->a, newCapacity *sizeof(STDatatype));
    7. if (tmp == NULL)
    8. {
    9. perror("realloc");
    10. exit(-1);
    11. }
    12. else
    13. {
    14. ps->a = tmp;
    15. ps->capacity == newCapacity;
    16. }
    17. }
    18. }
    1. void StackPush(ST* ps, STDatatype x)
    2. {
    3. assert(ps);
    4. check_capacity(ps);
    5. ps->a[ps->top] = x;
    6. ps->top++;//指向下一个
    7. }

    销毁

    1. void StackDestroy(ST* ps)
    2. {
    3. assert(ps);
    4. free(ps->a);
    5. ps->a = NULL;
    6. ps->top = ps->capacity = 0;
    7. }

     判空

    1. bool StackEmpty(ST* ps)//判空
    2. {
    3. assert(ps);
    4. return ps->top == 0;
    5. }

    Pop

    出栈,删除栈顶元素。

    1. void StackPop(ST* ps)//出栈
    2. {
    3. assert(ps);
    4. //if(ps->top>0)
    5. assert(!StackEmpty);
    6. ps->top--;
    7. }

    栈顶元素 

    1. STDatatype StackTop(ST* ps)
    2. {
    3. assert(ps);
    4. assert(!StackEmpty);
    5. return ps->a[ps->top-1];//top为最后一个元素的下一个
    6. }

    Size

    返回栈的元素个数。

    1. int StackSize(ST* ps)
    2. {
    3. assert(ps);
    4. return ps->top;
    5. }

    有的人会说,可以直接用ps.top来得到栈的个数,为什么还要封装,答案是封装可以不关注实现,我们这里是的top指向的是当前元素的下一个位置,那如果我从-1开始(没有元素),得到的top也不一样,需要注意这点。

    1. StackSize(&ps);
    2. //ps.top

    完整代码 

    1. //stack.cpp
    2. #include "Stack.h"
    3. void StackInit(ST* ps)
    4. {
    5. /*ps->a = NULL;
    6. ps->top = 0;
    7. ps->capacity = 0;*/
    8. //初始化空间
    9. ps->a = (STDatatype*)malloc(sizeof(STDatatype) * 4);
    10. if (ps->a == NULL)
    11. {
    12. perror("malloc");
    13. exit(-1);
    14. }
    15. ps->top = 0;
    16. ps->capacity = 4;
    17. }
    18. static void check_capacity(ST* ps)
    19. {
    20. if (ps->top == ps->capacity)
    21. {
    22. int newCapacity = ps->capacity * 2;
    23. STDatatype* tmp = (STDatatype*)realloc(ps->a, newCapacity *sizeof(STDatatype));
    24. if (tmp == NULL)
    25. {
    26. perror("realloc");
    27. exit(-1);
    28. }
    29. else
    30. {
    31. ps->a = tmp;
    32. ps->capacity == newCapacity;
    33. }
    34. }
    35. }
    36. void StackPush(ST* ps, STDatatype x)
    37. {
    38. assert(ps);
    39. check_capacity(ps);
    40. ps->a[ps->top] = x;
    41. ps->top++;//指向下一个
    42. }
    43. void StackPop(ST* ps)//出栈
    44. {
    45. assert(ps);
    46. //if(ps->top>0)
    47. assert(!StackEmpty(ps));
    48. ps->top--;
    49. }
    50. STDatatype StackTop(ST* ps)
    51. {
    52. assert(ps);
    53. assert(!StackEmpty(ps));
    54. return ps->a[ps->top-1];//top为最后一个元素的下一个
    55. }
    56. void StackDestroy(ST* ps)
    57. {
    58. assert(ps);
    59. free(ps->a);
    60. ps->a = NULL;
    61. ps->top = ps->capacity = 0;
    62. }
    63. bool StackEmpty(ST* ps)//判空
    64. {
    65. assert(ps);
    66. return ps->top == 0;
    67. }
    68. int StackSize(ST* ps)
    69. {
    70. assert(ps);
    71. return ps->top;
    72. }
    1. //stack.h
    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 capacity;
    12. int top;
    13. }ST;
    14. void StackInit(ST* ps);
    15. void StackDestroy(ST* ps);
    16. void StackPush(ST* ps, STDatatype x);
    17. void StackPop(ST* ps);//出栈
    18. STDatatype StackTop(ST* ps);
    19. bool StackEmpty(ST* ps);
    20. int StackSize(ST* ps);
    1. //test.cpp
    2. #include "Stack.h"
    3. void TestStack1()
    4. {
    5. ST ps;
    6. StackInit(&ps);
    7. StackPush(&ps, 1);
    8. StackPush(&ps, 1);
    9. StackPush(&ps, 1);
    10. StackPush(&ps, 1);
    11. StackPush(&ps, 1);
    12. StackDestroy(&ps);
    13. }
    14. void TestStack2()
    15. {
    16. ST ps;
    17. StackInit(&ps);
    18. StackPush(&ps, 2);
    19. printf("%d",StackTop(&ps));
    20. StackPop(&ps);
    21. StackSize(&ps);
    22. //ps.top
    23. StackDestroy(&ps);
    24. }
    25. int main()
    26. {
    27. //TestStack1();
    28. TestStack2();
    29. return 0;
    30. }

  • 相关阅读:
    java - 类和对象
    区块链入门相关概念
    自动化开展思路
    Office/WPS 好用的PPT插件-智能选择布局
    [ubuntu]给WSL子系统ubuntu安一个桌面环境
    docker部署MinIO集群
    Flutter 应用启动从闪屏页短暂黑屏再到第一个页面
    计算机网络(谢希仁)第八版课后题答案(第三章)
    AI 原生时代,更要上云:百度智能云云原生创新实践
    Python Day7 字典和元组【零基础】
  • 原文地址:https://blog.csdn.net/dwededewde/article/details/134252397