• 链栈


    1. #include "stdio.h"
    2. #include "stdlib.h"
    3. #include "math.h"
    4. #include "time.h"
    5. #define OK 1
    6. #define ERROR 0
    7. #define TRUE 1
    8. #define FALSE 0
    9. #define MAXSIZE 20 /* 存储空间初始分配量 */
    10. typedef int Status;
    11. typedef int SElemType; /* SElemType 类型根据实际情况而定,这里假设为 int */
    12. /*节点*/
    13. typedef struct StackNode {
    14. SElemType data;
    15. struct StackNode *next;
    16. } StackNode, *LinkStackPtr;
    17. /*链栈*/
    18. typedef struct {
    19. LinkStackPtr top;//栈顶节点,每次只能对栈顶的节点进行操作,所以这么设定
    20. int count;
    21. } LinkStack;
    22. /*打印一个节点的值*/
    23. Status visit(SElemType c) {
    24. printf("%d", c);
    25. return OK;
    26. }
    27. /* 构造一个空栈 S */
    28. Status InitStack(LinkStack *S) {
    29. S->top = (LinkStackPtr)malloc(sizeof(StackNode));
    30. if (!S->top)
    31. return ERROR;
    32. S->top = NULL;
    33. S->count = 0;
    34. return OK;
    35. }
    36. /* 把 S 置为空栈 */
    37. Status ClearStack(LinkStack *S) {
    38. LinkStackPtr p, q;
    39. p = S->top;//栈顶节点
    40. while (p) {
    41. q = p;
    42. p = p->next;
    43. free(q);
    44. }
    45. S->count = 0;
    46. return OK;
    47. }
    48. /* 若栈 S 为空栈,则返回 TRUE,否则返回 FALSE */
    49. Status StackEmpty(LinkStack S) {
    50. if (S.count == 0)
    51. return TRUE;
    52. else
    53. return FALSE;
    54. }
    55. /* 返回 S 的元素个数,即栈的长度 */
    56. int StackLength(LinkStack S) {
    57. return S.count;
    58. }
    59. /* 若栈不空,则用 e 返回 S 的栈顶元素,并返回 OK;否则返回 ERROR */
    60. Status GetTop(LinkStack S, SElemType *e) {
    61. if (S.top == NULL)
    62. return ERROR;
    63. else
    64. *e = S.top->data;
    65. return OK;
    66. }
    67. /* 插入元素 e 为新的栈顶元素 */
    68. Status Push(LinkStack *S, SElemType e) {
    69. //创建一个当前要操作的节点小s
    70. LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
    71. s->data = e; //为新节点赋值
    72. s->next = S->top;//新的节点指向栈顶节点
    73. S->top = s; //栈顶指针指向新的节点
    74. S->count++; //栈内的元素数+1
    75. return OK;
    76. }
    77. /* 若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK;否则返回 ERROR */
    78. int Pop(LinkStack *S, SElemType *e) {
    79. LinkStackPtr p;
    80. if (StackEmpty(*S))//如果栈是空的
    81. return ERROR;
    82. *e = S->top->data;
    83. p = S->top;
    84. S->top = S->top->next;
    85. free(p);
    86. S->count--;
    87. return OK;
    88. }
    89. /* 将栈顶结点赋值给 p,见图中3 */
    90. /* 使得栈顶指针下移一位,指向后一结点,见图中4 */
    91. /* 释放结点 p */
    92. Status StackTraverse(LinkStack S) {
    93. LinkStackPtr p;
    94. p = S.top;
    95. while (p) {
    96. visit(p->data);
    97. p = p->next;
    98. }
    99. printf(" ");
    100. return OK;
    101. }
    102. int main() {
    103. int j;
    104. LinkStack s;
    105. int e;
    106. if (InitStack(&s) == OK)
    107. for (j = 1; j <= 10; j++)
    108. Push(&s, j);
    109. printf("栈中元素依次为:");
    110. StackTraverse(s);
    111. Pop(&s, &e);
    112. printf("弹出的栈顶元素 e=%d ", e);
    113. printf("栈空否:%d(1:空 0:否) ", StackEmpty(s));
    114. GetTop(s, &e);
    115. printf("栈顶元素 e=%d 栈的长度为%d ", e, StackLength(s));
    116. ClearStack(&s);
    117. printf("清空栈后,栈空否:%d(1:空 0:否) ", StackEmpty(s));
    118. return 0;
    119. }





  • 相关阅读:
    关于用户、用户组及文件权限的试题
    lvm-简介
    项目中用到的jar包简介(1)
    Centos7开启SSH服务
    2.docker架构,原理,安装及简单应用
    如何平滑将注册中心从Eureka迁移到Nacos?
    8.k8s连载--重新生成k8s token(kubeadm join报错及解决)
    7. 复制k8s Node节点 并重新初始化k8s-nodes2节点 (k8s连载)
    6. k8s + jenkins 实现持续集成(完)
    5.k8s基本命令汇总
  • 原文地址:https://www.cnblogs.com/zhuzhenfeng/p/4626554.html
Copyright © 2020-2023  润新知