当前位置:   article > 正文

【数据结构】栈(实现+原码)_数据结构栈

数据结构栈

目录

栈的概念及结构

栈的实现

初始化栈

销毁

入栈

出栈

获取栈顶元素

获取栈中有效元素个数

判断栈是否为空

测试


栈的概念及结构

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

栈中的数据元素遵守后进先出LIFO(Last In First Out)原则。

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

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

栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

  1. #pragma once
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<assert.h>
  5. #include<stdbool.h>
  6. typedef int STDataType;
  7. // 下面是定长的静态栈的结构,实际中一般不实用,所以我们主要实现下面的支持动态增长的栈
  8. #define N 10
  9. typedef struct Stack
  10. {
  11. STDataType _a[N];
  12. int _top; // 栈顶
  13. }Stack;
  14. // 支持动态增长的栈
  15. typedef struct Stack
  16. {
  17. STDataType* a;
  18. int top;//栈顶
  19. int capacity;//栈容量
  20. }Stack;
  21. //初始化
  22. void StackInit(Stack*ps);
  23. //销毁
  24. void StackDestroy(Stack* ps);
  25. //入栈
  26. void StackPush(Stack* ps, STDataType x);
  27. //出栈
  28. void StackPop(Stack* ps);
  29. //获取栈顶元素
  30. STDataType StackTop(Stack* ps);
  31. //判断栈是否为空
  32. bool StackEmpty(Stack* ps);
  33. //获取栈中有效元素个数
  34. int StackSize(Stack* ps);

初始化栈

栈的初始化和销毁都与顺序表类似,这里就不再详细解释,只是顺序表中的size(有效元素个数),换成了这里的栈顶。

  1. void StackInit(Stack* ps)
  2. {
  3. assert(ps);
  4. ps->a = NULL;
  5. ps->capacity = 0;
  6. ps->top = 0;//也可初始化为-1,但在后面函数的实现中需做改变
  7. }

销毁

  1. void StackDestroy(Stack* ps)
  2. {
  3. assert(ps);
  4. free(ps->a);
  5. ps->a = NULL;
  6. ps->capacity = ps->top = 0;
  7. }

入栈

与顺序表一样,增加元素时必须先判断容量是否足够,容量不够时需扩容。

这里的入栈和顺序表的尾插一样。

  1. void StackPush(Stack* ps, STDataType x)
  2. {
  3. assert(ps);
  4. if (ps->top == ps->capacity)
  5. {
  6. int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
  7. STDataType* tmp = (STDataType*)realloc(ps->a , sizeof(STDataType) * newcapacity);
  8. if (tmp == NULL)
  9. {
  10. perror("realloc");
  11. exit(-1);
  12. }
  13. ps->a = tmp;
  14. ps->capacity = newcapacity;
  15. }
  16. ps->a[ps->top] = x;
  17. ps->top++;
  18. }

出栈

出栈即尾删,删除元素需判断栈是否为空,空栈不能出栈。

判断栈是否为空在下面实现。

  1. void StackPop(Stack* ps)
  2. {
  3. assert(ps);
  4. assert(!StackEmpty(ps));
  5. ps->top--;
  6. }

获取栈顶元素

栈顶元素即顺序表中最后一个元素,直接根据下标即可找到。

当然栈不能为空。

  1. STDataType StackTop(Stack* ps)
  2. {
  3. assert(ps);
  4. assert(!StackEmpty(ps));
  5. return ps->a[ps->top - 1];
  6. }

获取栈中有效元素个数

返回top即可。

  1. int StackSize(Stack* ps)
  2. {
  3. assert(ps);
  4. return ps->top;
  5. }


判断栈是否为空

可直接根据top是否等于0判断栈是否为空。

  1. bool StackEmpty(Stack* ps)
  2. {
  3. assert(ps);
  4. return ps->top == 0;
  5. }

测试

栈的测试不能将栈的每个元素依次打印,而需要先入栈,然后找栈顶元素,依次出栈。

  1. int main()
  2. {
  3. Stack s;
  4. StackInit(&s);
  5. StackPush(&s, 1);
  6. StackPush(&s, 2);
  7. StackPush(&s, 3);
  8. StackPush(&s, 4);
  9. StackPush(&s, 5);
  10. while (!StackEmpty(&s))
  11. {
  12. printf("%d ", StackTop(&s));
  13. StackPop(&s);
  14. }
  15. StackDestroy(&s);
  16. return 0;
  17. }

结果如下:

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

闽ICP备14008679号