当前位置:   article > 正文

C语言---栈(详解)---数据结构_返回栈顶元素

返回栈顶元素

如果要拿数据要先拿最上面的,不允许跳过第一个,拿第二个。

先重定义类型,意义前几篇都要讲,就不再赘述

实现栈要用到的头文件

结构体

top是记录栈中现有多少个数据,并且top一直处于栈顶

capacity就是容量大小,如果大于容量大小,那么我们就增容

栈实现的功能有:1.初始化栈 2,入栈,3.出栈 ,4.判断栈是否为空,5.返回栈顶元素,6.返回栈先有多少数据,7.释放栈

1.初始化栈

因为a是用来存放数据的,所以我们先给a创建一定的空间,(你创建的空间要和初始化cpacity的一样) 比如我给a创建了4的空间,那么我给capacity也初始化了4。

因为现在栈中斌没用数据,所以记录数据的top初始化为0

跟a中要相同,那么capacity容量初始化为4

2.入栈 

因为栈中a已经有元素了,不用像单链表那样,要先让a进去创建空间,所以这边我们要先判断记录栈的数据是否达到了容量大小

如果达到了,我们先用与a同类型的tmp创建空间 在原先的基础上*2的空间  

创建好后,我们再把tmp赋值给a

相应的capacity(容量大小)也要*2

然后我们直接对数据a中第top的位置存入数据(如果栈中没数据 top为0 那么就是数据a中第0个位置存入,如果有,那么就是数据a中第n个位置存入

 3.出栈

出栈的原理简单,我们直接对记录数据top--,(若数据中有6个元素,那么我们就--,就剩下5个元素,等相当于出栈了

这里要断言(assert)因为top不能为空,若为空,--会出内存错误

4.判断栈中是否为空

这里原理意思一样的,直接判断top是否为0,

用bool 就是top若为0则为假,若不为0,则为真

 5.返回栈顶元素

直接返回存放数据a中第top位置的数据,--是因为第一次入在0的位置,top为1,你要返回0的数据,得先--top

因为你要返回得数据是你重命名过的类型,那么你得函数返回类型也要是你重命名过的类型

 6.返回栈中有多少数据

 这里也是直接返回top的大小,top为几,就有几个元素

 7.如何打印栈

栈他不能遍历,所以我们要打印栈,(要先打印栈顶元素,然后再把栈顶元素出栈,再继续打印第二数据(这时候第二个数据就变成了栈顶元素

1.先判断栈是否为空

2.先打印栈顶元素

3.出栈

4.就此循环

8. 释放栈

我们直接释放a中的数据,再把指针a置为空。

最后把top(记录栈中的数据)和capacity(容量大小)都置为0

 

 栈的全部功能就完成了!

接下来是源码,需要自取

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <stdbool.h>
  5. typedef int STDataType;
  6. typedef struct Stack
  7. {
  8. STDataType* a;//存放数据
  9. int top;//指向栈顶元素
  10. int capacity;//容量大小
  11. }ST;
  12. void StackInit(ST* ps)//初始化栈
  13. {
  14. ps->a= (STDataType*)malloc(sizeof(STDataType) * 4);
  15. ps->top = 0;
  16. ps->capacity = 4;
  17. }
  18. void StackPush(ST* ps, STDataType data)//入栈
  19. {
  20. assert(ps);
  21. if (ps->top == ps->capacity)
  22. {
  23. STDataType* tmp = (STDataType*)realloc(ps->a, ps->capacity *2* sizeof(STDataType));
  24. ps->a = tmp;
  25. ps->capacity *= 2;
  26. }
  27. ps->a[ps->top] = data;
  28. ps->top++;
  29. }
  30. void StackPop(ST* ps)//出栈
  31. {
  32. assert(ps);
  33. assert(ps->top);
  34. ps->top--;
  35. }
  36. STDataType* StackTop(ST* ps)//返回栈顶元素
  37. {
  38. assert(ps);
  39. return ps->a[ps->top-1];
  40. }
  41. bool StackEmpty(ST* ps)
  42. {
  43. assert(ps);
  44. return ps->top == 0;
  45. }
  46. int StackSize(ST* ps)
  47. {
  48. assert(ps);
  49. return ps->top;
  50. }
  51. void StackDestroy(ST* ps)
  52. {
  53. free(ps->a);
  54. ps->a = NULL;
  55. ps->top = ps->capacity = 0;
  56. }
  57. void Intenode()
  58. {
  59. ST st;
  60. //初始化栈
  61. //void StackInit(Stack* ps);
  62. StackInit(&st);
  63. //入栈
  64. //void StackPush(Stack* ps, STDataType data);
  65. StackPush(&st, 1);
  66. StackPush(&st, 2);
  67. StackPush(&st, 3);
  68. StackPush(&st, 4);
  69. StackPush(&st, 5);
  70. StackPush(&st, 6);
  71. printf("当前栈中有%d\n", StackSize(&st));
  72. while (!StackEmpty(&st))//判断栈是否为空
  73. {
  74. printf("%d ", StackTop(&st));//打印栈顶元素,这里返回的是栈顶元素,我们把它打印出来
  75. StackPop(&st);//把栈顶元素出栈,接下来第二个元素就成为了栈顶元素,下次循环就打印这个栈顶元素
  76. }
  77. //出栈
  78. // void StackPop(Stack* ps);
  79. //返回栈顶元素
  80. //StackTop(Stack* ps);
  81. //查看栈中有多少元素
  82. //StackSize(Stack* ps);
  83. //判断栈是否为空
  84. // StackEmpty(Stack* ps);
  85. //销毁栈
  86. //StackDestroy(Stack* ps);
  87. StackDestroy(&st);
  88. }
  89. int main()
  90. {
  91. Intenode();
  92. return 0;
  93. }

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

闽ICP备14008679号