栈的顺序存储结构

小灰灰 2022-06-15 10:49 294阅读 0赞

栈的顺序存储是将数组下标为0的一端作为栈底。

一、结构

  1. #define MAXSIZE 20//存储空间初始化分配量
  2. typedef int SElemType;//此处可能是个结构体,练习使用int型足够了
  3. typedef struct
  4. {
  5. SElemType data[MAXSIZE];//数组存储数据元素,最大存储量MAXSIZE
  6. int top;//用于栈顶指针
  7. }SqStack;

示例:若现有一个栈,StackSize是5,则普通情况、空栈和满栈的情况如下图所示

Center

二、栈顺序存储进栈操作

Center 1

算法思路:

  1. 检查是否是满栈,如果满栈返回;

  2. 将数据元素加入栈顶;

  3. 栈顶位置计数加一;

三、栈顺序存储出栈操作

算法思路:

  1. 检查是否是空栈,空栈则返回;

  2. 获取栈顶元素,删除;

  3. 栈顶位置减一;

四、时间复杂度

没有任何循环,时间复杂度都是O(1)。

五、代码示例

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define ERROR -1
  4. #define OK 0
  5. #define MAXSIZE 20//存储空间初始化分配量
  6. typedef int SElemType;//此处可能是个结构体,练习使用int型足够了
  7. typedef struct
  8. {
  9. SElemType data[MAXSIZE];//数组存储数据元素,最大存储量MAXSIZE
  10. int top;//用于栈顶指针
  11. }SqStack;
  12. //初始化操作,建立一个空栈S
  13. void InitStack(SqStack *S);
  14. //若栈存在,则销毁它,因为是数组,置成空栈即可
  15. int DestroyStack(SqStack *S);
  16. //将栈清空
  17. void ClearStack(SqStack *S);
  18. //若栈为空,返回true,否则返回false
  19. int StackEmpty(SqStack S);
  20. //若栈存在且非空,用e返回S的栈顶元素
  21. int GetTop(SqStackS,SElemType *e);
  22. //若栈存在,插入新元素e到栈S中并成为栈顶元素
  23. int Push(SqStack *S,SElemType e);
  24. //删除S中栈顶元素,并用e返回其值
  25. int Pop(SqStack *S,SElemType *e);
  26. //返回栈S的元素个数
  27. int StackLength(SqStack S);
  28. //打印栈
  29. int StackPrint(SqStack S);
  30. //初始化操作,建立一个空栈S
  31. void InitStack(SqStack *S)
  32. {
  33. memset(S,0,sizeof(SqStack));
  34. S->top = -1;//置成空栈
  35. }
  36. //若栈存在,则销毁它,因为是数组,置成空栈即可
  37. int DestroyStack(SqStack *S)
  38. {
  39. if(S->top == -1)
  40. {
  41. return ERROR;
  42. }
  43. InitStack(S);
  44. return OK;
  45. }
  46. //将栈清空
  47. void ClearStack(SqStack *S)
  48. {
  49. InitStack(S);
  50. }
  51. //若栈为空,返回true,否则返回false
  52. int StackEmpty(SqStack S)
  53. {
  54. if(S.top == -1)
  55. {
  56. return ERROR;
  57. }
  58. return OK;
  59. }
  60. //若栈存在且非空,用e返回S的栈顶元素
  61. int GetTop(SqStackS,SElemType *e)
  62. {
  63. if(S.top == -1)
  64. {
  65. return ERROR;
  66. }
  67. *e = S.data[S.top];
  68. return OK;
  69. }
  70. //若栈存在,插入新元素e到栈S中并成为栈顶元素
  71. int Push(SqStack *S,SElemType e)
  72. {
  73. if(S->top == MAXSIZE - 1)//栈满
  74. {
  75. return ERROR;
  76. }
  77. S->top++;//栈顶指针加一
  78. S->data[S->top] = e;//将新元素压栈
  79. return OK;
  80. }
  81. //删除S中栈顶元素,并用e返回其值
  82. int Pop(SqStack *S,SElemType *e)
  83. {
  84. if(S->top == -1)
  85. {
  86. return ERROR;
  87. }
  88. *e = S->data[S->top];//将要删除的栈顶元素赋值给e
  89. S->top--;//栈顶指针减一
  90. return OK;
  91. }
  92. //返回栈S的元素个数
  93. int StackLength(SqStack S)
  94. {
  95. return S.top+1;//加一的原因是计数从0开始的
  96. }
  97. //打印栈
  98. int StackPrint(SqStack S)
  99. {
  100. if(S.top == -1)
  101. {
  102. return ERROR;
  103. }
  104. while(S.top != -1)
  105. {
  106. printf("位置:%d 元素:%d\n",S.top,S.data[S.top]);
  107. S.top--;
  108. }
  109. return OK;
  110. }
  111. int main()
  112. {
  113. inti = 0;
  114. SElemType e = 0;
  115. SqStack S;
  116. printf("\n=======初始化操作=========\n");
  117. InitStack(&S);
  118. printf("\n=======是否为空栈=========\n");
  119. if(ERROR == StackEmpty(S))//空栈
  120. {
  121. printf("空栈插入元素\n");
  122. for(i = 1;i< 10;i++)
  123. {
  124. Push(&S,i);
  125. }
  126. }
  127. printf("\n======打印栈信息=========\n");
  128. StackPrint(S);
  129. printf("\n=======获取栈长度========\n");
  130. printf("栈长度:%d\n",StackLength(S));
  131. printf("\n=====获取栈顶元素========\n");
  132. GetTop(S,&e);
  133. printf("栈顶元素:%d\n",e);
  134. printf("\n=====删除栈顶元素========\n");
  135. Pop(&S,&e);
  136. printf("删除栈顶元素:%d\n",e);
  137. printf("\n======打印栈信息=========\n");
  138. StackPrint(S);
  139. printf("\n=====清空并销毁栈========\n");
  140. ClearStack(&S);
  141. DestroyStack(&S);
  142. if(ERROR == StackEmpty(S))//空栈
  143. {
  144. printf("空栈\n");
  145. }
  146. return 0;
  147. }

发表评论

表情:
评论列表 (有 0 条评论,294人围观)

还没有评论,来说两句吧...

相关阅读

    相关 顺序存储

    想起童年最喜欢做的事就是弹溜溜,经常和小伙伴们玩输赢的,你赢了给你,你输了给我,也喜欢把溜溜放进饮料瓶里,用清水进行清洗,但是每次将第一个溜溜放进瓶子里,但洗完后,往往最后一个