当前位置:   article > 正文

【海贼王的数据航海】栈和队列

【海贼王的数据航海】栈和队列

目录

1 -> 栈

1.1 -> 栈的概念及结构

1.2 -> 栈的实现

1.2.1 -> Stack.h

1.2.2 -> Stack.c

1.2.3 -> Test.c

2 -> 队列

2.1 -> 队列的概念及结构

2.2 -> 队列的实现

2.2.1 -> Queue.h

2.2.2 -> Queue.c


1 -> 栈

1.1 -> 栈的概念及结构

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

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

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

1.2 -> 栈的实现

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

1.2.1 -> Stack.h

  1. #pragma once
  2. #define _CRT_SECURE_NO_WARNINGS 1
  3. #include <stdio.h>
  4. #include <assert.h>
  5. #include <stdbool.h>
  6. // 定长的静态栈的结构,实际中一般不实用
  7. //typedef int STDataType;
  8. //#define N 10
  9. //typedef struct Stack
  10. //{
  11. // STDataType a[N];
  12. // int top;
  13. //}ST;
  14. // 动态增长的栈
  15. typedef int STDataType;
  16. typedef struct Stack
  17. {
  18. STDataType* a;
  19. int top;
  20. int capacity;
  21. }ST;
  22. // 栈的初始化
  23. void STInit(ST* pst);
  24. // 栈的销毁
  25. void STDestroy(ST* pst);
  26. // 入栈
  27. void STPush(ST* pst, STDataType x);
  28. // 出栈
  29. void STPop(ST* pst);
  30. // 获取栈顶元素
  31. STDataType STTop(ST* pst);
  32. // 判空
  33. bool STEmpty(ST* pst);
  34. // 栈的有效元素个数
  35. int STSize(ST* pst);

1.2.2 -> Stack.c

  1. #include "Stack.h"
  2. // 栈的初始化
  3. void STInit(ST* pst)
  4. {
  5. assert(pst);
  6. pst->a = NULL;
  7. pst->top = 0;
  8. pst->capacity = 0;
  9. }
  10. // 栈的销毁
  11. void STDestroy(ST* pst)
  12. {
  13. assert(pst);
  14. free(pst->a);
  15. pst->a = NULL;
  16. pst->top = 0;
  17. pst->capacity = 0;
  18. }
  19. // 入栈
  20. void STPush(ST* pst, STDataType x)
  21. {
  22. if (pst->top == pst->capacity)
  23. {
  24. int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
  25. STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * sizeof(STDataType));
  26. if (tmp == NULL)
  27. {
  28. perror("realloc fail");
  29. return;
  30. }
  31. pst->a = tmp;
  32. pst->capacity = newCapacity;
  33. }
  34. pst->a[pst->top] = x;
  35. pst->top++;
  36. }
  37. // 出栈
  38. void STPop(ST* pst)
  39. {
  40. assert(pst);
  41. assert(!STEmpty(pst));
  42. pst->top--;
  43. }
  44. // 获取栈顶元素
  45. STDataType STTop(ST* pst)
  46. {
  47. assert(pst);
  48. assert(!STEmpty(pst));
  49. return pst->a[pst->top - 1];
  50. }
  51. // 判空
  52. bool STEmpty(ST* pst)
  53. {
  54. assert(pst);
  55. return pst->top == 0;
  56. }
  57. // 栈的有效元素个数
  58. int STSize(ST* pst)
  59. {
  60. assert(pst);
  61. return pst->top;
  62. }

1.2.3 -> Test.c

  1. #include "Stack.h"
  2. void Test1()
  3. {
  4. ST st;
  5. STInit(&st);
  6. STPush(&st, 1);
  7. STPush(&st, 2);
  8. printf("%d\n", STTop(&st));
  9. STTop(&st);
  10. STPush(&st, 3);
  11. STPush(&st, 4);
  12. STPush(&st, 5);
  13. while (!STEmpty(&st))
  14. {
  15. printf("%d ", STTop(&st));
  16. STPop(&st);
  17. }
  18. STDestroy(&st);
  19. }
  20. int main()
  21. {
  22. Test1();
  23. return 0;
  24. }

2 -> 队列

2.1 -> 队列的概念及结构

队列:只允许一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)。

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

2.2 -> 队列的实现

队列也可以用数组和链表的结构实现,使用链表的结构实现更优,因为如果使用数组的结构,出队列在数组头上出数据,效率较低。

2.2.1 -> Queue.h

  1. #pragma once
  2. #define _CRT_SECURE_NO_WARNINGS 1
  3. #include<stdlib.h>
  4. #include<assert.h>
  5. #include<stdbool.h>
  6. // 链式结构: 表示队列
  7. typedef int QDataType;
  8. typedef struct QueueNode
  9. {
  10. struct QueueNode* next;
  11. QDataType data;
  12. }QNode;
  13. typedef struct Queue
  14. {
  15. QNode* phead;
  16. QNode* ptail;
  17. int size;
  18. }Queue;
  19. // 队列的初始化
  20. void QueueInit(Queue* pq);
  21. // 队列的销毁
  22. void QueueDestroy(Queue* pq);
  23. // 队尾入队列
  24. void QueuePush(Queue* pq, QDataType x);
  25. // 队头出队列
  26. void QueuePop(Queue* pq);
  27. // 获取队头元素
  28. QDataType QueueFront(Queue* pq);
  29. // 获取队尾元素
  30. QDataType QueueBack(Queue* pq);
  31. // 获取队列中有效元素个数
  32. int QueueSize(Queue* pq);
  33. // 判空
  34. bool QueueEmpty(Queue* pq);

2.2.2 -> Queue.c

  1. #include "Queue.h"
  2. // 队列的初始化
  3. void QueueInit(Queue* pq)
  4. {
  5. assert(pq);
  6. pq->phead = NULL;
  7. pq->ptail = NULL;
  8. pq->size = 0;
  9. }
  10. // 队列的销毁
  11. void QueueDestroy(Queue* pq)
  12. {
  13. assert(pq);
  14. QNode* cur = pq->phead;
  15. while (cur)
  16. {
  17. QNode* next = cur->next;
  18. free(cur);
  19. cur = next;
  20. }
  21. pq->phead = NULL;
  22. pq->ptail = NULL;
  23. pq->size = 0;
  24. }
  25. // 队尾入队列
  26. void QueuePush(Queue* pq, QDataType x)
  27. {
  28. assert(pq);
  29. QNode* newnode = (QNode*)malloc(sizeof(QNode));
  30. if (newnode == NULL)
  31. {
  32. perror("malloc fail");
  33. return;
  34. }
  35. newnode->data = x;
  36. newnode->next = NULL;
  37. if (pq->ptail == NULL)
  38. {
  39. assert(pq->phead == NULL);
  40. pq->phead = newnode;
  41. pq->ptail = newnode;
  42. }
  43. else
  44. {
  45. pq->ptail->next = newnode;
  46. pq->ptail = newnode;
  47. }
  48. pq->size++;
  49. }
  50. // 队头出队列
  51. void QueuePop(Queue* pq)
  52. {
  53. assert(pq);
  54. assert(!QueueEmpty(pq));
  55. if (pq->phead->next == NULL)
  56. {
  57. free(pq->phead);
  58. pq->phead = NULL;
  59. pq->ptail = NULL;
  60. }
  61. else
  62. {
  63. QNode* next = pq->phead->next;
  64. free(pq->phead);
  65. pq->phead = next;
  66. }
  67. pq->size--;
  68. }
  69. // 获取队头元素
  70. QDataType QueueFront(Queue* pq)
  71. {
  72. assert(pq);
  73. assert(!QueueEmpty(pq));
  74. return pq->phead->data;
  75. }
  76. // 获取队尾元素
  77. QDataType QueueBack(Queue* pq)
  78. {
  79. assert(pq);
  80. assert(!QueueEmpty(pq));
  81. return pq->ptail->data;
  82. }
  83. // 获取队列中有效元素个数
  84. int QueueSize(Queue* pq)
  85. {
  86. assert(pq);
  87. return pq->size;
  88. }
  89. // 判空
  90. bool QueueEmpty(Queue* pq)
  91. {
  92. assert(pq);
  93. return pq->size == 0;
  94. }

感谢各位大佬支持!!!

互三啦!!!

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

闽ICP备14008679号