当前位置:   article > 正文

数据结构——栈(C语言)

数据结构——栈(C语言)

需求:无

栈的概念:

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

c34f687192654ad5aa0e465955a54098.png

 d2566a41fa8e4e7098a56dfb43be12b3.png

2c73b248841f45b28cd1686cf2520bd3.png

 栈的图示:

  • 栈的实现一般可以使用数组和链表实现,相对而言数组结构实现更优一些。因为尾插时代价小很多。(不用遍历)

0b0deb0772574f36a1eebd3b59cac623.png

 238a0866a0af4a449bd5daa5e9b7f213.png

栈的判空:

栈的判空有二种实现方式,一种是top赋为0,一种是top赋为-1。区别:是top为0的时候,是先赋值再++,top为-1的时候相反。a9a0d74436864a2a8aa6232f4a0b752b.png

 8d1f86bb5f9c4ec687c039aba9508c10.png

 栈的应用场景:

  • 函数的调用:操作系统会给每一个线程分配一个独立的内存空间,每一个内存空间其实就是一个栈结构,它会将临时标量,参数等等放到栈中,当栈执行完的时候,就会将最近的一个栈帧出栈。
  • 括号匹配,判断括号是否匹配,例如([]),[({})]

下面是源码:

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

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

闽ICP备14008679号