当前位置:   article > 正文

栈的基本操作(出栈、入栈、销毁..._栈(创建,销毁,入,出)

栈(创建,销毁,入,出)

系列文章目录

单链表(自用-CSDN博客

数据结构_线性表_顺序表(C语言实现+超详细逐步解析-CSDN博客

数据结构_线性表_双向链表(C语言实现+基本操作-CSDN博客

目录

一、栈基本概念、结构、图示

二、栈的基本操作

1、初始化

 代码:

创建栈

初始化栈

2、入栈

3、出栈

4、栈顶元素

5、栈中有效元素个数

6、检测栈是否为空

7、销毁栈

三、汇总


一、栈基本概念、结构、图示

栈的逻辑结构:

可以类比一个“羽毛球筒”,最先进入的羽毛球,必须等待,其他球取出,才能出来。

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。

进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。(如图所示:)

栈的物理结构:

可以用数组实现,也可以用链表实现。

二、栈的基本操作

1、初始化

 数组的结构实现更优一些。因为数组在尾插的代价比较小。

创建栈的结构体,包括栈的基本信息,数组栈顶栈的容量

 代码:

创建栈

  1. typedef struct Stack {
  2. SDataType* st;//动态开辟
  3. int top;//栈顶
  4. int capacity;//容量
  5. }ST;
初始化栈

!!!注意

top 的取值,

第一种,top  = 0,则栈顶元素在 top - 1 的位置

第二种,top  = -1,则栈顶元素在 top  的位置。

在本文中,top 取值为 0

  1. // 初始化栈
  2. void StackInit(ST* s) {
  3. assert(s);
  4. // 栈 s 不能为空
  5. //assert的作用是现计算表达式 test,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
  6. s->st = NULL;
  7. s->top = s->capacity = 0;
  8. }

2、入栈

注意事项:

1、栈满、栈空时,都需要对栈的空间进行扩容,使用realloc函数。

        空间开辟的规则,一般遵循,一开始开辟四个单位。

        后面扩容时,扩增为原来的2倍。

2、动态开辟问题

检查是否开辟成功。

使用完毕后,也必须使用free函数,释放掉。避免内存泄漏。

  1. // 入栈
  2. void StackPush(ST* s, SDataType data) {
  3. assert(s);
  4. int newcapacity;//新容量
  5. //栈满 栈空 条件判断
  6. //则需要开辟新空间,
  7. //栈空开辟 4个
  8. //栈满 开辟原先的 2倍
  9. if (s->capacity == s->top) {
  10. //栈空
  11. if (s->capacity == 0) {
  12. newcapacity = 4;
  13. }
  14. else newcapacity = s->capacity * 2; //栈满
  15. SDataType* temp = (SDataType*)realloc(s->st,sizeof(SDataType) * newcapacity);
  16. //扩容
  17. //检查是否扩容成功
  18. if (temp == NULL) {
  19. perror("malloc failed");
  20. exit(-1);
  21. }
  22. s->st = temp;
  23. s->capacity = newcapacity;
  24. }
  25. s->st[s->top] = data;
  26. s->top++;
  27. }

3、出栈

  1. // 出栈
  2. void StackPop(ST* s,SDataType* data) {
  3. assert(s);
  4. if (s->top == 0) {
  5. printf("栈空");
  6. }
  7. data = s->st[s->top - 1];
  8. s->top--;
  9. }

4、栈顶元素

栈顶元素在 top - 1 的位置

  1. // 获取栈顶元素
  2. SDataType StackTop(ST* s) {
  3. assert(s);
  4. assert(s->top > 0);//栈不为空
  5. return s->st[s->top - 1];
  6. }

5、栈中有效元素个数

  1. // 获取栈中有效元素个数
  2. int StackSize(ST* s) {
  3. assert(s);
  4. return s->top ;
  5. }

6、检测栈是否为空

  1. // 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
  2. bool StackEmpty(ST* s) {
  3. assert(s);
  4. if (s->top == 0) {
  5. return 1;
  6. }
  7. else return 0;
  8. }

7、销毁栈

  1. // 销毁栈
  2. void StackDestroy(ST* s) {
  3. assert(s);
  4. free(s->st);
  5. s->st = NULL;
  6. s->top = s->capacity = 0;
  7. }

三、汇总

本篇文章就到此结束啦!

以下就是全篇汇总啦~

  1. #include"Stack.h"
  2. // 初始化栈
  3. void StackInit(ST* s) {
  4. assert(s);
  5. // 栈 s 不能为空
  6. //assert的作用是现计算表达式 test,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
  7. s->st = NULL;
  8. s->top = s->capacity = 0;
  9. }
  10. // 入栈
  11. void StackPush(ST* s, SDataType data) {
  12. assert(s);
  13. int newcapacity;//新容量
  14. //栈满 栈空 条件判断
  15. //则需要开辟新空间,
  16. //栈空开辟 4个
  17. //栈满 开辟原先的 2倍
  18. if (s->capacity == s->top) {
  19. //栈空
  20. if (s->capacity == 0) {
  21. newcapacity = 4;
  22. }
  23. else newcapacity = s->capacity * 2; //栈满
  24. SDataType* temp = (SDataType*)realloc(s->st,sizeof(SDataType) * newcapacity);
  25. //扩容
  26. //检查是否扩容成功
  27. if (temp == NULL) {
  28. perror("malloc failed");
  29. exit(-1);
  30. }
  31. s->st = temp;
  32. s->capacity = newcapacity;
  33. }
  34. s->st[s->top] = data;
  35. s->top++;
  36. }
  37. // 出栈
  38. void StackPop(ST* s,SDataType* data) {
  39. assert(s);
  40. if (s->top == 0) {
  41. printf("栈空");
  42. }
  43. data = s->st[s->top - 1];
  44. s->top--;
  45. }
  46. // 获取栈顶元素
  47. SDataType StackTop(ST* s) {
  48. assert(s);
  49. assert(s->top > 0);//栈不为空
  50. return s->st[s->top - 1];
  51. }
  52. // 获取栈中有效元素个数
  53. int StackSize(ST* s) {
  54. assert(s);
  55. /*因为top是指向栈顶元素的最后一个位置
  56. 假设元素为:1,2,3,4,5,那么top肯定是指向5的后一个位置
  57. 又因为top是从0开始累加的,所以此时top肯定为5,刚好就是元素个数
  58. */
  59. return s->top ;
  60. }
  61. // 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
  62. bool StackEmpty(ST* s) {
  63. assert(s);
  64. if (s->top == 0) {
  65. return 1;
  66. }
  67. else return 0;
  68. }
  69. // 销毁栈
  70. void StackDestroy(ST* s) {
  71. assert(s);
  72. free(s->st);
  73. s->st = NULL;
  74. s->top = s->capacity = 0;
  75. }

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

闽ICP备14008679号