当前位置:   article > 正文

<数据结构----栈(C语言版)>_数据结构c语言版栈

数据结构c语言版栈

前言

本博客内容为数据结构中的一种类型----栈,大概讲解一下栈的概念,以及栈该如何去实现。

本节内容

1. 栈的概念

2. 栈的实现

2.1 动态结构定义

2.2  栈的初始化

2.3 入栈

2.3 出栈(压栈)

2.4 获取栈顶元素

2.5 获取栈中有效元素个数

2.6 检测栈是否为空

2.7 栈的销毁

3. 栈的使用

4. 完整源码

Stack.h

Stack.c

test.c

5. 最终实现效果


1. 栈的概念

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

2. 栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。本文采用的是数组栈

2.1 动态结构定义

  1. typedef int STDataType;// typedef定义STDataType类型
  2. typedef struct Stack
  3. {
  4. int* a; // 定义动态存储数组
  5. int top; // 记录栈顶
  6. int capacity; // 记录容量
  7. }ST;

2.2  栈的初始化

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

2.3 入栈

  1. void StackPush(ST* ps, STDataType data)
  2. {
  3. assert(ps);
  4. // 判断是否栈满,栈满则需要扩容
  5. if (ps->top == ps->capacity)
  6. {
  7. int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
  8. ps->a = (STDataType*)realloc(ps->a, newCapacity * sizeof(STDataType));
  9. if (ps->a == NULL)
  10. {
  11. printf("realloc fail\n");
  12. exit(-1);
  13. }
  14. ps->capacity = newCapacity;
  15. }
  16. ps->a[ps->top++] = data;
  17. }

2.3 出栈(压栈)

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

2.4 获取栈顶元素

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

2.5 获取栈中有效元素个数

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

2.6 检测栈是否为空

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

2.7 栈的销毁

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

3. 栈的使用

搞定所有栈的相关函数后,我们来建立一个text函数来测试一下,在这之前需要调用之前我们所定义的栈的相关函数。

  1. void test()
  2. {
  3. ST st;
  4. StackInit(&st);
  5. // 入栈
  6. StackPush(&st, 1);
  7. StackPush(&st, 2);
  8. StackPush(&st, 3);
  9. StackPush(&st, 4);
  10. StackPush(&st, 5);
  11. // 输出栈中的值,每输出一个,就出栈一个
  12. while (!StackEmpty(&st)) // 当栈为空时停止输出
  13. {
  14. printf("%d ", StackTop(&st));
  15. StackPop(&st);
  16. }
  17. StackDestroy(&st);
  18. }

4. 完整源码

Stack.h

  1. #pragma once
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include <stdbool.h>
  5. #include <stdlib.h>
  6. typedef int STDataType;
  7. typedef struct Stack
  8. {
  9. int* a;
  10. int top;
  11. int capacity;
  12. }ST;
  13. // 初始化栈
  14. void StackInit(ST* ps);
  15. // 入栈
  16. void StackPush(ST* ps, STDataType data);
  17. // 出栈
  18. void StackPop(ST* ps);
  19. // 获取栈顶元素
  20. STDataType StackTop(ST* ps);
  21. // 获取栈中有效元素个数
  22. int StackSize(ST* ps);
  23. // 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
  24. bool StackEmpty(ST* ps);
  25. // 销毁栈
  26. void StackDestroy(ST* ps);

Stack.c

  1. #include "Stack.h"
  2. void StackInit(ST* ps)
  3. {
  4. assert(ps);
  5. ps->a = NULL;
  6. ps->top = 0;
  7. ps->capacity = 0;
  8. }
  9. void StackPush(ST* ps, STDataType data)
  10. {
  11. assert(ps);
  12. if (ps->top == ps->capacity)
  13. {
  14. int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
  15. ps->a = (STDataType*)realloc(ps->a, newCapacity * sizeof(STDataType));
  16. if (ps->a == NULL)
  17. {
  18. printf("realloc fail\n");
  19. exit(-1);
  20. }
  21. ps->capacity = newCapacity;
  22. }
  23. ps->a[ps->top++] = data;
  24. }
  25. void StackPop(ST* ps)
  26. {
  27. assert(ps);
  28. assert(ps->top > 0);
  29. ps->top--;
  30. }
  31. STDataType StackTop(ST* ps)
  32. {
  33. assert(ps);
  34. assert(ps->top > 0);
  35. return ps->a[ps->top - 1];
  36. }
  37. int StackSize(ST* ps)
  38. {
  39. assert(ps);
  40. return ps->top;
  41. }
  42. bool StackEmpty(ST* ps)
  43. {
  44. assert(ps);
  45. return ps->top == 0;
  46. }
  47. void StackDestroy(ST* ps)
  48. {
  49. assert(ps);
  50. free(ps->a);
  51. ps->a = NULL;
  52. ps->capacity = ps->top = 0;
  53. }

test.c

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

5. 最终实现效果


后续内容等博主继续学习后分享给大家。请大家继续关注,不断督促,共同进步!

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

闽ICP备14008679号