当前位置:   article > 正文

【数据结构】栈的实现

【数据结构】栈的实现

一、简述栈


1.栈的概念


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

2.栈的结构

二、栈的实现

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

下面我们基于数组实现栈:

1.定义数组动态增长的栈struct Stack
  1. typedef int STDataType;
  2. typedef struct Stack
  3. {
  4. STDataType* a;
  5. int top; // 栈顶
  6. int capacity; // 容量
  7. }Stack;
2.初始化栈StackInit函数
  1. // 初始化栈
  2. void StackInit(Stack* ps)
  3. {
  4. assert(ps);
  5. ps->a = NULL;
  6. ps->top = 0; //指向栈顶元素的下一个位置
  7. ps->capacity = 0;
  8. }
3.销毁栈StackDestroy函数
  1. // 销毁栈
  2. void StackDestroy(Stack* ps)
  3. {
  4. free(ps->a);
  5. ps->a = NULL;
  6. ps->top = 0;
  7. ps->capacity = 0;
  8. }
4.入栈StackPush函数

首先判断栈的容量,然后在栈顶写入数据:

  1. // 入栈
  2. void StackPush(Stack* ps, STDataType data)
  3. {
  4. assert(ps);
  5. //扩容
  6. int capacity = ps->capacity;
  7. int top = ps->top;
  8. if (ps->top == ps->capacity)
  9. {
  10. int newcapacity = capacity == 0 ? 4 : 2 * capacity;
  11. STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
  12. if (!tmp)
  13. {
  14. perror("realloc fail");
  15. return;
  16. }
  17. ps->a = tmp;
  18. ps->capacity = newcapacity;
  19. }
  20. ps->a[top] = data;
  21. ps->top++;
  22. }

5.出栈StackPop函数

在栈顶删除数据,注意判断栈是否为空:

  1. // 出栈
  2. void StackPop(Stack* ps)
  3. {
  4. assert(ps);
  5. assert(!StackEmpty(ps));
  6. ps->top--;
  7. }
7.判断栈是否为空StackEmpty函数
  1. // 检测栈是否为空,如果为空返回true结果,如果不为空返回false
  2. bool StackEmpty(Stack* ps)
  3. {
  4. return ps->top == 0;
  5. }
8.求出栈的大小StackSize函数
  1. // 获取栈中有效元素个数
  2. int StackSize(Stack* ps)
  3. {
  4. return ps->top;
  5. }

原文链接:http://t.csdnimg.cn/SeFSV

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

闽ICP备14008679号