当前位置:   article > 正文

栈和队列的基础(C语言)(全部代码,详细图解)(​创建,初始化,入队,出队,入栈,出栈​,获取队顶数据,注销等.....)_c语言 栈和队列代码

c语言 栈和队列代码

前言

队列:(含详细图解): ( 创建,初始化,入队,出队,获取队中数据个数,获取队顶数据,注销队列)

栈:(含详细图解): (创建,初始化,入栈,出栈,获取栈中数据个数,获取栈顶数据,注销栈)

队列

一.队列的基本概念

1.1队列的基本概念

队列,简称队,是一种特殊的线性表。其特殊性在于,它只允许在表的一端(称为队尾)进行插入操作,而在表的另一端(称为队头)进行删除操作。这种“先进先出”(First In First Out,FIFO)的规则是队列的核心特性。具体来说,向队列中插入新的数据元素被称为"入队",新入队的元素就成为了队列的队尾元素。从队列中删除队头元素被称为"出队",其后继元素成为新的队头元素。

值得一提的是,队列作为一种线性表,也存在两种存储结构:顺序存储结构和链式存储结构。顺序队列通过一段连续的存储空间实现,而链式队列则通过链表实现。

1.2基本图

二.构建一个结构体

2.1构建结构体代码

  1. typedef int QDataType;
  2. typedef struct QueueNode {
  3. struct QueueNode* next;
  4. QDataType data;
  5. }QueueNode;
  6. typedef struct Queue {
  7. QueueNode* head;
  8. QueueNode* tail;
  9. }Queue;

2.2结构体定义解释

三.队列初始化

3.1初始化代码

  1. void QueueInit(Queue* pq)
  2. {
  3. assert(pq);
  4. pq->head = pq->tail = NULL;
  5. }

3.2初始化图解

四.入队

4.1入队代码

  1. void QueuePush(Queue* pq, QDataType x)
  2. {
  3. assert(pq);
  4. QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
  5. if (newnode == NULL)
  6. {
  7. printf("malloc fault\n");
  8. exit(-1);
  9. }
  10. newnode->data = x;
  11. newnode->next = NULL;
  12. if (pq->head == NULL)
  13. {
  14. pq->head = pq->tail = newnode;
  15. }
  16. else
  17. {
  18. pq->tail->next = newnode;
  19. pq->tail = newnode;
  20. }
  21. }

4.2入队图解

五.出队

5.1出队代码

  1. void QueuePop(Queue* pq)
  2. {
  3. assert(pq);
  4. assert(pq->head);
  5. QueueNode* next = pq->head->next;
  6. free(pq->head);
  7. pq->head = next;
  8. if (pq->head == NULL)
  9. {
  10. pq->tail = NULL;
  11. }
  12. }

5.2出队细节图解

六.注销当前队列

6.1注销队列代码

  1. void QueueDestory(Queue* pq)
  2. {
  3. assert(pq);
  4. QueueNode* cur = pq->head;
  5. while (cur)
  6. {
  7. QueueNode* next = cur->next;
  8. free(cur);
  9. cur = next;
  10. }
  11. pq->head = pq->tail = NULL;
  12. }

6.2注销队列图解

七.队头和队尾的输出

7.1队头输出代码

  1. QDataType QueueFront(Queue* pq)
  2. {
  3. assert(pq);
  4. assert(pq->head);
  5. return pq->head->data;
  6. }

7.2队尾输出代码

  1. QDataType QueueBack(Queue* pq)
  2. {
  3. assert(pq);
  4. assert(pq->head);
  5. return pq->tail->data;
  6. }

八.判断队列是否为空

8.1判断是否为空代码

  1. //返回1是空,返回0是非空
  2. int QueueEmpty(Queue* pq)
  3. {
  4. assert(pq);
  5. return pq->head == NULL ? 1 : 0;
  6. }

九.计算队列的节点个数

9.1计算节点个数代码

  1. int QueueSize(Queue* pq)
  2. {
  3. assert(pq);
  4. int size = 0;
  5. QueueNode* cur = pq->head;
  6. while (cur)
  7. {
  8. ++size;
  9. cur = cur->next;
  10. }
  11. return size;
  12. }

十.全部代码

10.1全部代码

  1. #pragma once
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<assert.h>
  5. typedef int QDataType;
  6. typedef struct QueueNode {
  7. struct QueueNode* next;
  8. QDataType data;
  9. }QueueNode;
  10. typedef struct Queue {
  11. QueueNode* head;
  12. QueueNode* tail;
  13. }Queue;
  14. void QueueInit(Queue* pq)
  15. {
  16. assert(pq);
  17. pq->head = pq->tail = NULL;
  18. }
  19. void QueueDestory(Queue* pq)
  20. {
  21. assert(pq);
  22. QueueNode* cur = pq->head;
  23. while (cur)
  24. {
  25. QueueNode* next = cur->next;
  26. free(cur);
  27. cur = next;
  28. }
  29. pq->head = pq->tail = NULL;
  30. }
  31. void QueuePush(Queue* pq, QDataType x)
  32. {
  33. assert(pq);
  34. QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
  35. if (newnode == NULL)
  36. {
  37. printf("malloc fault\n");
  38. exit(-1);
  39. }
  40. newnode->data = x;
  41. newnode->next = NULL;
  42. if (pq->head == NULL)
  43. {
  44. pq->head = pq->tail = newnode;
  45. }
  46. else
  47. {
  48. pq->tail->next = newnode;
  49. pq->tail = newnode;
  50. }
  51. }
  52. void QueuePop(Queue* pq)
  53. {
  54. assert(pq);
  55. assert(pq->head);
  56. QueueNode* next = pq->head->next;
  57. free(pq->head);
  58. pq->head = next;
  59. if (pq->head == NULL)
  60. {
  61. pq->tail = NULL;
  62. }
  63. }
  64. QDataType QueueFront(Queue* pq)
  65. {
  66. assert(pq);
  67. assert(pq->head);
  68. return pq->head->data;
  69. }
  70. QDataType QueueBack(Queue* pq)
  71. {
  72. assert(pq);
  73. assert(pq->head);
  74. return pq->tail->data;
  75. }
  76. //返回1是空,返回0是非空
  77. int QueueEmpty(Queue* pq)
  78. {
  79. assert(pq);
  80. return pq->head == NULL ? 1 : 0;
  81. }
  82. int QueueSize(Queue* pq)
  83. {
  84. assert(pq);
  85. int size = 0;
  86. QueueNode* cur = pq->head;
  87. while (cur)
  88. {
  89. ++size;
  90. cur = cur->next;
  91. }
  92. return size;
  93. }
  94. void PrintfQueue(Queue* pq)
  95. {
  96. QueueNode* cur = pq->head;
  97. if (pq->head == NULL)
  98. {
  99. printf("当前队列为空,没有节点\n");
  100. }
  101. else
  102. {
  103. while (cur)
  104. {
  105. printf("%d ", cur->data);
  106. cur = cur->next;
  107. }
  108. }
  109. printf("\n\n");
  110. }
  111. TestQueue()
  112. {
  113. Queue q;
  114. QueueInit(&q);
  115. QueuePush(&q, 1);
  116. QueuePush(&q, 7);
  117. QueuePush(&q, 3);
  118. QueuePush(&q, 9);
  119. QueuePush(&q, 2);
  120. QueuePush(&q, 3);
  121. QueuePush(&q, 6);
  122. printf("当前队列的全部节点为:\n");
  123. PrintfQueue(&q);
  124. printf("当前队头数据为:%d \n\n", QueueFront(&q));
  125. printf("当前队尾数据为:%d \n\n", QueueBack(&q));
  126. printf("出队3次:\n");
  127. QueuePop(&q);
  128. QueuePop(&q);
  129. QueuePop(&q);
  130. printf("当前队列的全部节点为:\n");
  131. PrintfQueue(&q);
  132. printf("插入3个节点\n");
  133. QueuePush(&q, 22);
  134. QueuePush(&q, 44);
  135. QueuePush(&q, 66);
  136. printf("当前队列的全部节点为:\n");
  137. PrintfQueue(&q);
  138. printf("全部出队\n");
  139. while (!QueueEmpty(&q))
  140. {
  141. printf("%d ", QueueFront(&q));
  142. QueuePop(&q);
  143. }
  144. printf("\n");
  145. printf("当前队列的全部节点为:\n");
  146. PrintfQueue(&q);
  147. QueueDestory(&q);
  148. }
  149. int main()
  150. {
  151. TestQueue();
  152. return 0;
  153. }

10.2运行结果

 栈

十一.栈

11.1栈详细内容

栈的细节内容在这里(下面的链接可以跳转过去)

栈的基础细节(c语言)(全部代码,详细图解):入栈,出栈,获取栈中数据个数,栈顶数据等

http://t.csdnimg.cn/eIMRT

   以上就是本期补齐的内容,欢迎参考指正,如有不懂,欢迎评论或私信出下期!!! 

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

闽ICP备14008679号