当前位置:   article > 正文

数据结构进阶之栈_数据进入栈是从哪里进

数据进入栈是从哪里进

今天我们学习的是数据结构初阶的,请先看看我们今天需要学的内容,如下:

一、栈的概念

栈:一种特殊的线性表,其只允许在固定的一端(也就是栈顶)进行插入和删除元素的操作,这个操作也被称为后进先出原则,一会会告诉大家,现在这块做个认识,因此进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。

相信大家在看完概念一定是懵懵的,光看概念不足以了解栈,接下来看了栈的结构图压栈、出栈的操作原理相信大家一定会理解的,那么我们接着往后看。

二、栈的结构及操作原理

压栈:栈的插入数据操作叫做进栈(压栈、入栈),入栈的数据在栈顶进入。

出栈:栈的删除数据操作叫做出栈,出数据也在栈顶

原理图如下:(由原理图可以看出数据进出栈满足后进先出原则)

后进先出原则:因为栈的操作只能从栈顶来进行操作,所以后面进去的数据先出来,由原理图可以明确看出,相信大家明白了栈的原理之后会发现栈和顺序表和单链表的实现好像差不多,没错,那么接下来大家跟着小编一起来实现一个属于自己的栈吧。

三、栈的实现

栈的大概样子就是这样,顺序表和单链表都可以实现,但是由于顺序表的底层逻辑是数组,栈的大概样子也很像数组,所以我们用顺序表实现。

1、栈的结构

  1. //栈的结构
  2. typedef int SKDataType;
  3. typedef struct Stack
  4. {
  5. SKDataType* a; //存放数据的数组
  6. int top; //栈的顶部下标
  7. int capacity; //栈的内存大小
  8. }Stack;

2、栈实现所需函数(这个就和栈的定义一样,记住它的所需函数,每次实现栈都是这些函数)

  1. //栈的初始化
  2. void SKInit(Stack* sk);
  3. //入栈
  4. void SKPush(Stack* sk, SKDataType x);
  5. //栈内存大小的开辟
  6. void SKExpand(Stack* sk);
  7. //出栈
  8. void SKPop(Stack* sk);
  9. //获取栈顶元素
  10. SKDataType SKTop(Stack* sk);
  11. //判断栈是否为空
  12. bool SKEmpty(Stack* sk);
  13. //栈的销毁
  14. void SKDestroy(Stack* sk);

3、栈实现中所需函数的实现

  1. //栈的初始化
  2. void SKInit(Stack* sk)
  3. {
  4. sk->a = NULL;
  5. sk->capacity = 0;
  6. sk->top = 0;
  7. }
  8. //栈内存大小的开辟
  9. void SKExpand(Stack* sk)
  10. {
  11. //进来先需要判断栈是否需要进行内存开辟,不需要开辟就直接退出
  12. if (sk->capacity == sk->top)
  13. {
  14. //进来之后需要判断是不是第一次开辟内存,也就是和顺序表的内存开辟相同
  15. int newcapacity = sk->a == NULL ? 4 : 2 * (sk->capacity);
  16. //在此处进行内存开辟
  17. SKDataType* tem = (SKDataType*)realloc(sk->a, newcapacity * sizeof(SKDataType));
  18. if (tem == NULL)
  19. {
  20. perror("realloc");
  21. exit(1);
  22. }
  23. //在这块就已经开辟内存成功
  24. sk->a = tem;
  25. sk->capacity = newcapacity;
  26. }
  27. }
  28. //入栈
  29. void SKPush(Stack* sk, SKDataType x)
  30. {
  31. //入栈的时候需要先判断栈中的内存大小是否需要开辟
  32. SKExpand(sk);
  33. //然后将数据放入栈中
  34. sk->a[sk->top] = x;
  35. sk->top++;
  36. }
  37. //出栈
  38. void SKPop(Stack* sk)
  39. {
  40. //出栈和顺序表尾部数据的删除一样
  41. //先得判断栈中是否有数据,才可以进行下一步出栈操作
  42. assert(sk->a);
  43. sk->top--;
  44. }
  45. //获取栈顶元素
  46. SKDataType SKTop(Stack* sk)
  47. {
  48. //获取栈顶元素之前需要先判断栈中是否有元素才可以获取
  49. assert(sk->a);
  50. return sk->a[sk->top - 1];//因为sk->top是栈顶元素前一个位置的下标,所以获取栈顶元素时需要给top--
  51. }
  52. //判断栈是否为空
  53. bool SKEmpty(Stack* sk)
  54. {
  55. //如果栈为空就返回true,不为空就返回false
  56. return sk->a == NULL ? true : false;
  57. }
  58. //栈的销毁
  59. void SKDestroy(Stack* sk)
  60. {
  61. //栈的销毁需要把开辟的内存释放并且置为空即可
  62. free(sk->a);
  63. sk->a = NULL;
  64. sk->capacity = 0;
  65. sk->top = 0;
  66. }

以上就是栈的实现的所有步骤及注释,供大家参考,结合原理图,再回忆一下顺序表,相信大家一定会理解的。如果有什么不理解的或者看不懂的可以私信我或者评论区留言我会回复每一条消息的。

四、栈的简单题目(深入了解栈)

题目解析和逐步分析都在上面,相信大家看了以后一定可以更加深入了解栈,好了今天的内容就到这里,栈的内容也算全部告诉大家了,但是要真正的理解栈和使用栈还是需要大家多做一点与数据结构有关的算法题,相信大家最后一定会掌握栈和其他的数据结构的。

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

闽ICP备14008679号