链栈

  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("\n");
  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\n", e);
  113. printf("栈空否:%d(1:空 0:否)\n", StackEmpty(s));
  114. GetTop(s, &e);
  115. printf("栈顶元素 e=%d 栈的长度为%d\n", e, StackLength(s));
  116. ClearStack(&s);
  117. printf("清空栈后,栈空否:%d(1:空 0:否)\n", StackEmpty(s));
  118. return 0;
  119. }





posted @ 2015-07-07 11:54  Lucas_1993  阅读(184)  评论(0编辑  收藏  举报