当前位置:   article > 正文

c++队列

c++队列

目录

 

  c++队列基础了解

  c++队列代码分步详解   全部代码在最后面

 队列的入队和出队具体实现(图形方式)

 队列的基本操作c++ 

 全部代码


 

c++队列基础了解

  队列:
    队列也是操作受限的线性表 限定在只能在表的一端进行插入 在表的另一端进行删除
 
    栈是先进后出  队列是先进先出
    允许插入数据的位置叫队尾 插入数据叫入队
    允许删除数据的位置叫队头 删除数据叫出队

    队列的物理实现 顺序队列(数组实现) 链式队列(链表实现)
    我们只讨论链式队列 顺序队列除了考试没什么人用的

  c++队列代码分步详解   全部代码在最后面

   以下8个队列函数就全部结束了 现在就有了队列的基础功能了 

   1 队列的数据结构 需要两个结构体

  1. struct lnode
  2. {
  3. elemtype data;//存储队列中的元素
  4. struct lnode* next;//next指针
  5. };
  6. struct linkqueue
  7. {
  8. lnode* head, * tail;//队列的头指针和尾指针
  9. };

2 初始化队列函数

  1. bool initqueue(linkqueue& qq)//结构体别名
  2. {
  3. qq.head = new(std::nothrow)lnode;//分配头节点
  4. if (qq.head == nullptr) return false;//内存不足 返回失败
  5. qq.head->next = nullptr;//头结点的下一结点暂时不存在 置空
  6. qq.tail = qq.head; //尾指针目前指向头结点
  7. return true;
  8. }

3 销毁队列函数

  1. void destroyqueue(linkqueue& qq)
  2. {
  3. lnode* tmp;
  4. while (qq.head != nullptr)
  5. {
  6. tmp = qq.head->next; //tmp先保存下一结点的地址
  7. delete qq.head; //释放当前节点
  8. qq.head = tmp; //头指针移动到下一节点
  9. }
  10. }

 队列的入队和出队具体实现(图形方式)

1:队列的入队规则  大白话来说就是从尾部next指针进行添加节点

2: 队列的出队规则  大白话来说就是从头部next指针进行删除结点

了解了入队和出队的实现方式 就能理解入队出队代码了

4 元素入队函数

  1. bool inqueue(linkqueue& qq,const elemtype ee)
  2. {
  3. if (qq.head == nullptr) { cout << "队列未初始化。\n"; return false; }
  4. lnode* tmp = new(std::nothrow)lnode;//分配新节点
  5. if (tmp == nullptr) return false;
  6. tmp->data = ee; //把元素的值存入data中
  7. tmp->next = nullptr; //tmp因为是最后一个元素所以next是nullptr
  8. qq.tail->next = tmp; //把tmp追加到qq.tail后
  9. qq.tail = tmp; // 重新设置tail指针。
  10. return true;
  11. }

5 元素出队函数

  1. bool OutQueue(linkqueue& QQ, elemtype& ee)
  2. {
  3. if (QQ.head == nullptr) { cout << "队列未初始化。\n"; return false; }
  4. if (QQ.head->next == nullptr) { cout << "队列为空。\n"; return false; }
  5. lnode* tmp = QQ.head->next; // tmp指向第一个结点。
  6. ee = tmp->data; // 把第一个结点的数据保存到ee中。
  7. QQ.head->next = tmp->next; // 头结点的next指针指向第二个结点。
  8. // 如果出队的是最后一个结点。
  9. if (tmp == QQ.tail) QQ.tail = QQ.head;
  10. delete tmp; // 释放已出队的结点。
  11. return true;
  12. }

6 显示队列中全部的元素函数。

  1. void printqueue(linkqueue& qq)
  2. {
  3. if (qq.head == nullptr) { cout << "队列未初始化。\n"; return; }
  4. lnode* tmp = qq.head->next;
  5. while (tmp != nullptr)
  6. {
  7. cout << tmp->data<<" ";
  8. tmp = tmp->next;
  9. }
  10. cout << endl;
  11. }

7 求队列长度函数

  1. int Length(linkqueue& qq)
  2. {
  3. if (qq.head == nullptr) { cout << "队列未初始化。\n"; return false; }
  4. lnode* tmp = qq.head->next;
  5. int length = 0;
  6. while (tmp != nullptr)
  7. {
  8. length++;
  9. tmp = tmp->next;
  10. }
  11. return length;
  12. }

8 清空队列函数

  1. void clear(linkqueue& qq)
  2. {
  3. if (qq.head == nullptr) { cout << "队列未初始化。\n"; return; }
  4. // 清空队列是指释放链表全部的数据结点,但保留头结点。
  5. lnode* tmp = qq.head->next;
  6. lnode* tmpnext;
  7. while (tmp != nullptr)
  8. {
  9. tmpnext = tmp->next; // tmpnext保存下一结点的地址。
  10. delete[]tmp; // 释放当前结点。
  11. tmp = tmpnext; // tmp指针移动到下一结点。
  12. }
  13. qq.head->next = nullptr;
  14. qq.tail = qq.head; // 尾指针指向头结点。
  15. }

队列的基本操作c++ 

main 函数内容

  1. int main()
  2. {
  3. linkqueue qq; //创建队列
  4. memset(&qq, 0, sizeof(qq));
  5. initqueue(qq);//初始化队列
  6. //入队使用for循环
  7. cout << "使用for循环入队0-9" << endl;
  8. for (int i = 0; i < 10; i++)
  9. {
  10. inqueue(qq, i);
  11. }
  12. cout << "队列中的元素是:";
  13. printqueue(qq);
  14. cout << "队列的长度是:" << Length(qq) << "。\n";
  15. elemtype ee; // 创建一个数据元素变量ee 用于接收出队的数据。
  16. //出队一个元素
  17. cout << "首先将首元素出队" << endl;
  18. OutQueue(qq, ee);
  19. cout << "出队的元素值为" << ee << endl;
  20. cout << "队列中的元素是:";
  21. printqueue(qq);
  22. //全部出队
  23. cout << "使用while 将剩余元素全部出队" << endl;
  24. while (OutQueue(qq, ee))
  25. cout << "出队的元素值为" << ee << endl;
  26. cout << "队列中的元素是:";
  27. printqueue(qq);
  28. destroyqueue(qq); // 销毁队列QQ。
  29. }

运行后截图

 全部代码

  1. #include <iostream>
  2. using namespace std;
  3. typedef int elemtype; // 自定义队列的数据元素为整数。
  4. //队列的数据结构 两个结构体
  5. struct lnode
  6. {
  7. elemtype data;//存储队列中的元素
  8. struct lnode* next;//next指针
  9. };
  10. struct linkqueue
  11. {
  12. lnode* head, * tail;//队列的头指针和尾指针
  13. };
  14. // 初始化队列。
  15. bool initqueue(linkqueue& qq)//结构体别名
  16. {
  17. qq.head = new(std::nothrow)lnode;//分配头节点
  18. if (qq.head == nullptr) return false;//内存不足 返回失败
  19. qq.head->next = nullptr;//头结点的下一结点暂时不存在 置空
  20. qq.tail = qq.head; //尾指针目前指向头结点
  21. return true;
  22. }
  23. // 销毁队列QQ。
  24. void destroyqueue(linkqueue& qq)
  25. {
  26. lnode* tmp;
  27. while (qq.head != nullptr)
  28. {
  29. tmp = qq.head->next; //tmp先保存下一结点的地址
  30. delete qq.head; //释放当前节点
  31. qq.head = tmp; //头指针移动到下一节点
  32. }
  33. }
  34. // 元素入队。
  35. bool inqueue(linkqueue& qq,const elemtype ee)
  36. {
  37. if (qq.head == nullptr) { cout << "队列未初始化。\n"; return false; }
  38. lnode* tmp = new(std::nothrow)lnode;//分配新节点
  39. if (tmp == nullptr) return false;
  40. tmp->data = ee; //把元素的值存入data中
  41. tmp->next = nullptr; //tmp因为是最后一个元素所以next是nullptr
  42. qq.tail->next = tmp; //把tmp追加到qq.tail后
  43. qq.tail = tmp; // 重新设置tail指针。
  44. return true;
  45. }
  46. // 元素出队。
  47. // // 元素出队。
  48. bool OutQueue(linkqueue& QQ, elemtype& ee)
  49. {
  50. if (QQ.head == nullptr) { cout << "队列未初始化。\n"; return false; }
  51. if (QQ.head->next == nullptr) { return false; }
  52. lnode* tmp = QQ.head->next; // tmp指向第一个结点。
  53. ee = tmp->data; // 把第一个结点的数据保存到ee中。
  54. QQ.head->next = tmp->next; // 头结点的next指针指向第二个结点。
  55. // 如果出队的是最后一个结点。
  56. if (tmp == QQ.tail) QQ.tail = QQ.head;
  57. delete tmp; // 释放已出队的结点。
  58. return true;
  59. }
  60. // 显示队列中全部的元素。
  61. void printqueue(linkqueue& qq)
  62. {
  63. if (qq.head == nullptr) { cout << "队列未初始化。\n"; return; }
  64. lnode* tmp = qq.head->next;
  65. while (tmp != nullptr)
  66. {
  67. cout << tmp->data<<" ";
  68. tmp = tmp->next;
  69. }
  70. cout << endl;
  71. }
  72. // 求队列的长度。
  73. int Length(linkqueue& qq)
  74. {
  75. if (qq.head == nullptr) { cout << "队列未初始化。\n"; return false; }
  76. lnode* tmp = qq.head->next;
  77. int length = 0;
  78. while (tmp != nullptr)
  79. {
  80. length++;
  81. tmp = tmp->next;
  82. }
  83. return length;
  84. }
  85. // 清空队列。
  86. void clear(linkqueue& qq)
  87. {
  88. if (qq.head == nullptr) { cout << "队列未初始化。\n"; return; }
  89. // 清空队列是指释放链表全部的数据结点,但保留头结点。
  90. lnode* tmp = qq.head->next;
  91. lnode* tmpnext;
  92. while (tmp != nullptr)
  93. {
  94. tmpnext = tmp->next; // tmpnext保存下一结点的地址。
  95. delete[]tmp; // 释放当前结点。
  96. tmp = tmpnext; // tmp指针移动到下一结点。
  97. }
  98. qq.head->next = nullptr;
  99. qq.tail = qq.head; // 尾指针指向头结点。
  100. }
  101. int main()
  102. {
  103. linkqueue qq; //创建队列
  104. memset(&qq, 0, sizeof(qq));
  105. initqueue(qq);//初始化队列
  106. //入队使用for循环
  107. cout << "使用for循环入队0-9" << endl;
  108. for (int i = 0; i < 10; i++)
  109. {
  110. inqueue(qq, i);
  111. }
  112. cout << "队列中的元素是:";
  113. printqueue(qq);
  114. cout << "队列的长度是:" << Length(qq) << "。\n";
  115. elemtype ee; // 创建一个数据元素变量ee 用于接收出队的数据。
  116. //出队一个元素
  117. cout << "首先将首元素出队" << endl;
  118. OutQueue(qq, ee);
  119. cout << "出队的元素值为" << ee << endl;
  120. cout << "队列中的元素是:";
  121. printqueue(qq);
  122. //全部出队
  123. cout << "使用while 将剩余元素全部出队" << endl;
  124. while (OutQueue(qq, ee))
  125. cout << "出队的元素值为" << ee << endl;
  126. cout << "队列中的元素是:";
  127. printqueue(qq);
  128. destroyqueue(qq); // 销毁队列QQ。
  129. }

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

闽ICP备14008679号