当前位置:   article > 正文

栈结构

栈结构

1. 概念    

   典型的栈结构如下图所示:栈结构只能在一端操作,该操作端叫做栈顶,另一端叫做栈底。栈结构按照“后进先出”(Last In First Out, LIFO)的方式处理结点数据。

    

 

                                                                                                 图 1 栈结构

 

    栈结构也包括顺序结构与链式结构两种。

    在栈结构中只有栈顶元素是可以访问的,因此栈结构的操作也比较简单,主要两个即入栈和出栈。

  1. 1#include <unistd.h>
  2. 2#include <string.h>
  3. 3#include <stdlib.h>
  4. 4#include <stdio.h>
  5. 5
  6. 6#define MAX_SIZE 10
  7. 7
  8. 8typedef struct {
  9. 9 int id;
  10. 10 char name[64];
  11. 11 int age;
  12. 12}Student;
  13. 13
  14. 14typedef struct {
  15. 15 Student info[MAX_SIZE+1]; //数据元素
  16. 16 int top; //栈顶
  17. 17}Stack;
  18. 18
  19. 19//初始化栈
  20. 20Stack *stackInit(void)
  21. 21{
  22. 22 Stack *stk = (Stack *)malloc(sizeof(Stack));
  23. 23 if(NULL == stk){
  24. 24 return NULL;
  25. 25 }
  26. 26 stk->top = 0;
  27. 27 return stk;
  28. 28}
  29. 29
  30. 30//判空栈
  31. 31int stackIsEmpty(Stack *stk)
  32. 32{
  33. 33 return (0 == stk->top);
  34. 34}
  35. 35
  36. 36//判满栈
  37. 37int StackIsFull(Stack *stk)
  38. 38{
  39. 39 return (stk->top >= MAX_SIZE);
  40. 40}
  41. 41
  42. 42//清空栈
  43. 43int stackClear(Stack *stk)
  44. 44{
  45. 45 stk->top = 0;
  46. 46}
  47. 47
  48. 48//释放
  49. 49void StackFree(Stack *stk)
  50. 50{
  51. 51 if (stk)
  52. 52 free(stk);
  53. 53}
  54. 54
  55. 55//入栈
  56. 56int stackPush(Stack *stk, Student data)
  57. 57{
  58. 58 if (stk->top+1 > MAX_SIZE)
  59. 59 return -1;
  60. 60
  61. 61 stk->info[++stk->top] = data;
  62. 62
  63. 63 return 0;
  64. 64}
  65. 65
  66. 66//出栈
  67. 67int stackPop(Stack *stk, Student *data)
  68. 68{
  69. 69 if (stackIsEmpty(stk))
  70. 70 return -1;
  71. 71
  72. 72 *data = stk->info[stk->top--];
  73. 73 return 0;
  74. 74}
  75. 75
  76. 76//读栈顶元素
  77. 77int stackPeek(Stack *stk, Student *data)
  78. 78{
  79. 79 if (stackIsEmpty(stk)) {
  80. 80 fprintf(stderr,"%s","stack is Empty\n");
  81. 81 return -1;
  82. 82 }
  83. 83 *data = stk->info[stk->top];
  84. 84 return 0;
  85. 85}
  86. 86
  87. 87int main()
  88. 88{
  89. 89 Student stu[3] = {
  90. 90 {1, "zhangsan",20},
  91. 91 {2, "lisi",21},
  92. 92 {3, "wangwu",19}
  93. 93 };
  94. 94 Student data = {0};
  95. 95
  96. 96 Stack *stk = stackInit();
  97. 97 if (NULL == stk) {
  98. 98 fprintf(stderr,"%s","stackInit faield\n");
  99. 99 return -1;
  100. 100
  101. 101 }
  102. 102 stackPush(stk, stu[0]);
  103. 103 stackPush(stk, stu[1]);
  104. 104 stackPush(stk, stu[2]);
  105. 105
  106. 106 if (!stackPeek(stk, &data))
  107. 107 printf("id=%d\tname=%s\tage=%d\n",data.id,data.name,data.age);
  108. 108
  109. 109 if (!stackPop(stk, &data))
  110. 110 printf("id=%d\tname=%s\tage=%d\n",data.id,data.name,data.age);
  111. 111
  112. 112 if (!stackPeek(stk, &data))
  113. 113 printf("id=%d\tname=%s\tage=%d\n",data.id,data.name,data.age);
  114. 114
  115. 115 stackClear(stk);
  116. 116
  117. 117 if(stackIsEmpty(stk))
  118. 118 fprintf(stderr,"%s","stack is Empty\n");
  119. 119 StackFree(stk);
  120. 120
  121. 121 return 0;
  122. 122}

    代码比较简单,主要还是想再复习巩固下数据结构相关概念与知识。希望看到的童鞋,可以自己试着写一下^_^

                                                                         更多文章,欢迎关注公众号交流~

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/641348
推荐阅读
相关标签
  

闽ICP备14008679号