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