• C语言实现动态栈


    1. #include<stdio.h>
    2. #include<stdlib.h>
    3. #include<stdbool.h>
    4. // 每一个节点的数据类型
    5. typedef struct Node
    6. {
    7. int data;
    8. struct Node * pNext;
    9. }NODE, * PNODE; // NODE等价 struct Node PNODE等价于 struct Node *
    10. //
    11. typedef struct Stack
    12. {
    13. PNODE pTop;
    14. PNODE pBottom;
    15. }STACK, * PSTACK;
    16. void init(PSTACK pS);
    17. void push(PSTACK pS, int val);
    18. void traverse(PSTACK pS);
    19. bool pop(PSTACK pS, int * val);
    20. bool empty(PSTACK pS);
    21. void clear(PSTACK pS);
    22. // 这是一个动态栈
    23. int main(void) {
    24. STACK s; // STACK 等价于 stack Stack
    25. init(&s);// 目的是造出一个空栈
    26. push(&s, 1);
    27. push(&s, 2);
    28. push(&s, 3);
    29. push(&s, 4);
    30. traverse(&s);
    31. int val;
    32. if (pop(&s, &val))
    33. {
    34. printf("出栈成功 出栈的元素是%d\n", val);
    35. } else {
    36. printf("出栈失败\n");
    37. }
    38. traverse(&s);
    39. clear(&s);
    40. traverse(&s);
    41. if (pop(&s, &val))
    42. {
    43. printf("出栈成功 出栈的元素是%d\n", val);
    44. } else {
    45. printf("出栈失败\n");
    46. }
    47. return 0;
    48. }
    49. void init(PSTACK pS) {
    50. pS->pTop = (PNODE)malloc(sizeof(NODE));
    51. if (NULL == pS->pTop)
    52. {
    53. printf("动态内存分配失败");
    54. exit(-1);
    55. }
    56. pS->pTop->pNext = NULL; // 初始化头结点为NULL
    57. pS->pBottom = pS->pTop;
    58. }
    59. void push(PSTACK pS, int val) {
    60. PNODE pNew = (PNODE)malloc(sizeof(NODE));
    61. pNew->data = val; // 填充新数据
    62. pNew->pNext = pS->pTop; // 追加结果
    63. pS->pTop = pNew;// 更新top
    64. }
    65. void traverse(PSTACK pS) {
    66. PNODE p = pS->pTop;
    67. printf("开始打印\n");
    68. while (p != pS->pBottom)
    69. {
    70. printf("%d ", p->data);
    71. p = p->pNext;
    72. }
    73. printf("结束打印\n");
    74. }
    75. bool empty(PSTACK pS) {
    76. if (pS->pTop == pS->pBottom)
    77. {
    78. return true;
    79. }
    80. return false;
    81. }
    82. bool pop(PSTACK pS, int * val) {
    83. if (empty(pS))
    84. {
    85. return false;
    86. }
    87. *val = pS->pTop->data;
    88. PNODE r = pS->pTop;
    89. pS->pTop = pS->pTop->pNext;
    90. free(r);
    91. r = NULL;
    92. return true;
    93. }
    94. void clear(PSTACK pS) {
    95. if (empty(pS))
    96. {
    97. return;
    98. }
    99. PNODE p = pS->pTop;
    100. PNODE q = NULL;
    101. while (p != pS->pBottom)
    102. {
    103. q = p->pNext;
    104. free(p);
    105. p = q;
    106. }
    107. pS->pTop = pS->pBottom;
    108. }

    运行效果

  • 相关阅读:
    DAY02 c++对c的扩展
    多种工具软件实现宿主机与Ubuntu虚拟机之间文件传输
    一文读懂差分数组~
    【springcloud系列】nacos服务注册实现
    生成带分表和水印的excel压缩文件
    数据结构 栈Stack的理解与C语言实现
    知识(202402)
    Java Comparator 自定义复杂排序
    【GitLab私有仓库】在Linux上用Gitlab搭建自己的私有库并配置cpolar内网穿透
    vscode设置tab或者enter补全代码
  • 原文地址:https://blog.csdn.net/qq_35061546/article/details/139724202