当前位置:   article > 正文

【C语言】数组栈的实现

【C语言】数组栈的实现

栈的概念及结构


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


栈的定义

  1. typedef int STDataType;
  2. typedef struct Stack
  3. {
  4. STDataType* _a;//数组
  5. int _top; // 栈顶,类似顺序表中的_size
  6. int _capacity; // 容量
  7. }Stack;

对栈的操作

栈初始化

_top可以初始化为0,此时栈顶元素是_top-1的位置

_top也可以初始化为1,此时栈顶元素就是_top的位置

初始化为0

      初始化为1

  1. // 初始化栈
  2. void StackInit(Stack* ps)
  3. {
  4. assert(ps);
  5. ps->_a = NULL;
  6. ps->_capacity = 0;
  7. ps->_top = 0;
  8. }

压栈(入栈)

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

出栈

  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. return ps->_a[ps->_top-1];
  5. }

判断栈是否为空

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

栈的长度

_top初始化为0,此时的_top的大小刚好就是栈的长度

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

栈销毁

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

完整总代码

头文件

  1. #pragma once
  2. #include<stdio.h>
  3. #include<assert.h>
  4. #include<stdlib.h>
  5. #include<stdbool.h>
  6. // 支持动态增长的栈
  7. typedef int STDataType;
  8. typedef struct Stack
  9. {
  10. STDataType* _a;//数组
  11. int _top; // 栈顶,类似顺序表中的_size
  12. int _capacity; // 容量
  13. }Stack;
  14. // 初始化栈
  15. void StackInit(Stack* ps);
  16. // 入栈
  17. void StackPush(Stack* ps, STDataType data);
  18. // 出栈
  19. void StackPop(Stack* ps);
  20. // 获取栈顶元素
  21. STDataType StackTop(Stack* ps);
  22. // 获取栈中有效元素个数
  23. int StackSize(Stack* ps);
  24. // 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
  25. bool StackEmpty(Stack* ps);
  26. // 销毁栈
  27. void StackDestroy(Stack* ps);

函数定义

  1. #include"Stack.h"
  2. // 初始化栈
  3. void StackInit(Stack* ps)
  4. {
  5. assert(ps);
  6. ps->_a = NULL;
  7. ps->_capacity = 0;
  8. ps->_top = 0;
  9. }
  10. // 入栈
  11. void StackPush(Stack* ps, STDataType data)
  12. {
  13. assert(ps);
  14. //扩容
  15. if (ps->_capacity == ps->_top)
  16. {
  17. int newcapacity = ps->_capacity == 0 ? 4 : 2 * (ps->_capacity);
  18. STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));
  19. if (tmp == NULL)
  20. {
  21. perror("realloc fail");
  22. return;
  23. }
  24. ps->_a = tmp;
  25. ps->_capacity = newcapacity;
  26. }
  27. ps->_a[ps->_top++] = data;
  28. }
  29. // 出栈
  30. void StackPop(Stack* ps)
  31. {
  32. assert(ps);
  33. assert(!StackEmpty(ps));
  34. ps->_top--;
  35. }
  36. // 获取栈顶元素
  37. STDataType StackTop(Stack* ps)
  38. {
  39. assert(ps);
  40. return ps->_a[ps->_top-1];
  41. }
  42. // 获取栈中有效元素个数
  43. int StackSize(Stack* ps)
  44. {
  45. assert(ps);
  46. return ps->_top;
  47. }
  48. // 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
  49. bool StackEmpty(Stack* ps)
  50. {
  51. assert(ps);
  52. return ps->_top == 0;
  53. }
  54. // 销毁栈
  55. void StackDestroy(Stack* ps)
  56. {
  57. assert(ps);
  58. ps->_capacity = ps->_top = 0;
  59. free(ps->_a);
  60. ps->_a = NULL;
  61. }

测试

  1. #include"Stack.h"
  2. void test()
  3. {
  4. Stack s;
  5. StackInit(&s);
  6. StackPush(&s, 1);
  7. StackPush(&s, 2);
  8. StackPush(&s, 3);
  9. StackPush(&s, 4);
  10. while (StackSize(&s)>0)
  11. {
  12. printf("%d ", StackTop(&s));
  13. StackPop(&s);
  14. }
  15. StackDestroy(&s);
  16. }
  17. int main()
  18. {
  19. test();
  20. return 0;
  21. }

欢迎各位一起学习交流~

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

闽ICP备14008679号