• 初阶数据结构学习记录——여섯 栈


    目录

    栈的概念及结构

    Stack.h

    Stack.c

    Test.c


    栈的概念及结构

    先上个标准化术语再写吧。

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

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

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

    后进先出,但是并不是后进的一定会先出。1234四个字符,出栈的顺序可以是4321,也可以是2143,先放12,然后出栈,再放34然后出栈。

    栈有数组栈和链表栈。假设存入1234,4个数字。如果是数组栈,依次存入,栈顶位置也就是4的位置,想要由栈顶依次删除会很简单。如果是链表栈,尾删操作就需要双指针,当然也可以头删,也就是存入第一个数值,存第二个数值时,第二个的next指向第一个,那么出栈也就是头删操作。

    不过实际上,数组栈还是最方便的。接下来的代码也就是数组栈。

    Stack.h

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include
    6. typedef int STDatatype;
    7. typedef struct Stack
    8. {
    9. STDatatype* a;
    10. int capacity;
    11. int top;//栈顶
    12. }ST;
    13. void StackInit(ST* ps);
    14. void StackDestroy(ST* ps);
    15. void StackPush(ST* ps, STDatatype x);
    16. void StackPop(ST* ps);
    17. bool StackEmpty(ST* ps);
    18. STDatatype StackTop(ST* ps);
    19. STDatatype StackSize(ST* ps);

    栈所要实现的功能就是这些,依次是初始化,销毁,插入,删除,检查是否为空,返回栈顶,返回大小。

    由于是数组操作,整体代码写起来不算难。

    Stack.c

    1. #include "Stack.h"
    2. void StackInit(ST* ps)
    3. {
    4. assert(ps);
    5. ps->a = (STDatatype*)malloc(sizeof(STDatatype) * 10);//当然也可以初始化为NULL
    6. if (ps->a == NULL)
    7. {
    8. perror("malloc fail");
    9. exit(-1);
    10. }
    11. ps->top = 0;
    12. ps->capacity = 10;
    13. }
    14. //这里的初始化,我用的就是传入地址,在函数里malloc,且top = 0。这个其实和我之前的试写现实通讯录所用的一样。top = 0,录入一个数据,就变成1,意为存有1个数据。
    15. void StackDestroy(ST * ps)
    16. {
    17. assert(ps);
    18. free(ps->a);
    19. ps->a = NULL;
    20. ps->top = ps->capacity = 0;
    21. }
    22. void StackPush(ST* ps, STDatatype x)
    23. {
    24. assert(ps);
    25. if (ps->top == ps->capacity)
    26. {
    27. STDatatype* tmp = (STDatatype*)realloc(ps->a, ps->capacity * 2 * sizeof(STDatatype));
    28. if (tmp == NULL)
    29. {
    30. perror("ralloc fail");
    31. exit(-1);
    32. }
    33. ps->a = tmp;
    34. ps->capacity *= 2;
    35. }
    36. ps->a[ps->top] = x;
    37. ps->top++;
    38. }
    39. bool StackEmpty(ST* ps)
    40. {
    41. assert(ps);
    42. return ps->top == 0;
    43. }
    44. void StackPop(ST* ps)
    45. {
    46. assert(ps);
    47. //assert(ps->top > 0);
    48. assert(!StackEmpty(ps));
    49. ps->top--;
    50. }
    51. assert(ps->top > 0); //为了防止删多了而断言一下
    52. bool StackEmpty(ST* ps)
    53. {
    54. return ps->top == 0;
    55. }
    56. //这里简化过了代码,我们也可以使用if else。而return ps->top == 0则是利用了布尔值,这个表达式为真那么也就意味着数组已经空了。
    57. STDatatype StackTop(ST * ps)
    58. {
    59. assert(ps);
    60. //assert(ps->top > 0);
    61. assert(!StackEmpty(ps));
    62. return ps->a[ps->top - 1];
    63. }
    64. STDatatype StackSize(ST* ps)
    65. {
    66. assert(ps);
    67. return ps->top;
    68. }

    这里也写了点测试代码

    Test.c

    1. void TestStack1()
    2. {
    3. ST st;
    4. StackInit(&st);
    5. StackPush(&st, 1);
    6. StackPush(&st, 2);
    7. StackPush(&st, 3);
    8. StackPush(&st, 4);
    9. StackPush(&st, 5);
    10. printf("size:%d\n", StackSize(&st)); // 不关心底层实现
    11. printf("size:%d\n", st.top+1); // 关心
    12. StackPop(&st);
    13. StackPop(&st);
    14. StackPop(&st);
    15. StackPop(&st);
    16. StackPop(&st);
    17. StackPop(&st);
    18. printf("%d\n", StackTop(&st));
    19. StackDestroy(&st);
    20. }
    21. int main()
    22. {
    23. TestStack1();
    24. }

    结束。

  • 相关阅读:
    C语言 --- 指针(5)
    kubernetes临时存储 Ephemeral Storage
    Revit如何使用插件实现【参数同步】?
    聊聊logback的ThresholdFilter
    Hexo博客主题Next添加动态线条背景canvas_nest
    小样本数据集 (Few-shot Learning)
    阿里P8大牛带你深入理解SpringCloud微服务构建文档
    【跨境电商】WhatsApp营销保姆级教程!
    python图片上写中文,添加字幕
    新版Android Studio中设置gradle的JDK版本
  • 原文地址:https://blog.csdn.net/kongqizyd146/article/details/127792876