当前位置:   article > 正文

【数据结构】-- 栈

【数据结构】-- 栈

引入:

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的元素遵循先进后出的原则,先入栈的元素总是先后出栈。
压栈:栈的插入操作叫做进栈 / 压栈 / 入栈, 入数据在栈顶
出栈:栈的删除操作叫做出栈。 出数据也在栈顶

注意:入栈顺序是DCBA,出栈顺序不一定是ABCD,可以边入边出

所以,入栈顺序是DCBA ,出栈顺序有很多种。

栈的实现:

数组,单向链表,双向链表都能够实现栈:

数组:

单链表:

用单链表实现栈有一个问题,单链表不能回头,如图这么设计,在压栈之后,不方便出栈。

所以我们可以以开头作为栈顶,然后对链表头插来实现栈,出栈的时候使用头删。

双向链表:

 双向链表可以通过前一个元素直接访问上一个元素,这使得在双向链表中实现栈的出栈功能更加高效和方便。因为双向链表可以从尾部直接访问到最后一个元素,从而实现了栈的后进先出(LIFO)特性。

由于CPU的高速缓存,在这里我们使用数组来实现栈 。

头文件:

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #pragma once
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <stdbool.h>
  6. #include <assert.h>
  7. typedef int STDataType;
  8. typedef struct Stack
  9. {
  10. STDataType* a;
  11. int top;
  12. int capacity;
  13. }ST;
  14. void STInit(ST* pst);//初始化
  15. void STDestory(ST* pst);//销毁
  16. void STPush(ST* pst, STDataType x);//压栈
  17. void STPop(ST* pst);//出栈
  18. STDataType STTop(ST* pst);//获取栈顶的元素
  19. bool STEmpty(ST* pst);//判断栈是否为空
  20. int STSize(ST* pst);//判断栈里面有多少中数据(数据个数)

实现文件:

初始化栈的时候可以开辟空间也可以后面再开辟,在初始化top的时候有两种写法。

把top初始化为0:
这时,top指向栈顶元素的下一位

把top初始化-1:

这时,top指向栈顶元素。

不必过分在意top,无论top指向哪里,top只是一个数字,数据依然从栈顶开始存储。只不过,第一种方法有了第一个数据的时候top的值是1,第二种方法有了第一个数据时top的值为0。

在这里我们选择第一种写法。

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include "Stack.h"
  3. //初始化
  4. void STInit(ST* pst)
  5. {
  6. assert(pst);
  7. pst->a = NULL;
  8. //top指向栈顶数据的下一个位置
  9. pst->capacity = 0;
  10. pst->top = 0;
  11. //top指向栈顶数据
  12. //pst->top = -1;
  13. }
  14. //销毁
  15. void STDestory(ST* pst)
  16. {
  17. assert(pst);
  18. free(pst->a);
  19. pst->a = NULL;
  20. pst->capacity = pst->top = 0;
  21. }
  22. //压栈
  23. void STPush(ST* pst, STDataType x)
  24. {
  25. assert(pst);
  26. //扩容
  27. if (pst->top == pst->capacity)
  28. {
  29. int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
  30. STDataType* tmp = (STDataType*)realloc(pst->a, newcapacity * sizeof(STDataType));
  31. if (tmp == NULL)
  32. {
  33. perror("realloc fail");
  34. return;
  35. }
  36. pst->a = tmp;
  37. pst->capacity = newcapacity;
  38. }
  39. pst->a[pst->top] = x;
  40. pst->top++;
  41. }
  42. //出栈
  43. void STPop(ST* pst)
  44. {
  45. assert(pst);
  46. pst->top--;
  47. }
  48. //获取栈顶的元素
  49. STDataType STTop(ST* pst)
  50. {
  51. assert(pst);
  52. return pst->a[pst->top - 1];
  53. }
  54. //判断栈是否为空
  55. bool STEmpty(ST* pst)
  56. {
  57. assert(pst);
  58. return pst->top == 0;
  59. }
  60. //判断栈里面有多少中数据(数据个数)
  61. int STSize(ST* pst)
  62. {
  63. assert(pst);
  64. return pst->top;
  65. }

 测试文件:

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include"Stack.h"
  3. int main()
  4. {
  5. ST s;
  6. STInit(&s);
  7. STPush(&s, 1);
  8. STPush(&s, 2);
  9. STPush(&s, 3);
  10. STPush(&s, 4);
  11. printf("%d \n", STTop(&s));
  12. //列出栈中元素
  13. while (!STEmpty(&s))
  14. {
  15. printf("%d ", STTop(&s));
  16. STPop(&s);
  17. }
  18. return 0;
  19. }

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

闽ICP备14008679号