当前位置:   article > 正文

队列,队列的出队与入队(c++)链式队列_c++队列入队

c++队列入队

队列介绍:

        队列是一种数据结构,是一种特殊的受限的线性表,只能在头和尾操作,一端入队,一端出队。队列中一般用front(前)表示头结点,用于队列元素的出队,用rear(后)表示尾结点,用于队列添加元素(入队)。队列中储存元素的叫做结点,头节点不储存数据。形象来说,队列就像排队取票,队列前面的人取票离开,新来的在队列后面。

队列的c++实现方式:

有三种:顺序队列,循环队列,链式队列(这里用链式队列)

链式队列运用链表的思想来实现出队入队比较灵活,头节点的地址不变,不用担心队列过小和假溢出的情况

如图:

1.初始化队列

2.入队

(这date写错了,是data)

链表元素间不连续

3.出队(记住队首出队)

由于头结点没有数据,所以以头节点指向的结点为队首

这里只是示意图,实际上要定义一个结点地址和队首结点地址相同,便于释放空间。而且当

front->next==rear时,没有下一个结点,直接将rear=front,并释放空间。

实现代码如下:

  1. #include<iostream>
  2. #define Status int
  3. #define QElemType int
  4. using namespace std;
  5. //链队结点数据结构
  6. typedef struct Qnode {
  7. QElemType data;//数据域
  8. struct Qnode* next;//指针域
  9. }Qnode,*queueptr;
  10. typedef struct LinkQueue {
  11. struct Qnode* front;
  12. struct Qnode* rear;//front指向队头,rear指向队尾
  13. }LinkQueue;
  14. //**************操作函数****************//
  15. Status initqueue(LinkQueue& Q) {
  16. Q.front = Q.rear = new Qnode;
  17. Q.rear->next = NULL;
  18. return 1;
  19. }//初始化队列
  20. Status EnQueue(LinkQueue& Q, QElemType e) {
  21. Qnode* p;
  22. p = new Qnode;//生成新结点
  23. p->data = e;
  24. p->next = NULL;
  25. Q.rear->next = p;
  26. Q.rear = p;
  27. return 1;
  28. }//入队,队尾添加
  29. bool DeQueue(LinkQueue& Q, QElemType &e) {
  30. queueptr p;
  31. if (Q.front == Q.rear)
  32. return false;
  33. e = Q.front->next->data;
  34. p = Q.front->next;
  35. Q.front->next = p->next;
  36. if (Q.rear == p)
  37. Q.rear = Q.front;
  38. free(p);
  39. return true;
  40. }//出队,队头删除
  41. //*******功能操作*******//
  42. void menu(){
  43. printf("1.入队 2.出队 3.结束");
  44. }
  45. void EnterToQueue(LinkQueue& Q) {
  46. int n; QElemType e; int flag;
  47. printf("输入入队元素个数:\n");
  48. cin >> n;
  49. for (int i = 0; i < n; i++) {
  50. printf("输入第%d个入队元素\n", i + 1);
  51. cin >> e;
  52. flag=EnQueue(Q, e);
  53. if (flag)
  54. printf("%d已入队\n",e);
  55. }
  56. }//入队操作
  57. void DeleteFromQueue(LinkQueue Q) {
  58. int n; QElemType e; int flag;
  59. printf("输入出队个数:\n");
  60. cin >> n;
  61. for (int i = 0; i < n; i++) {
  62. flag = DeQueue(Q, e);
  63. if (flag) {
  64. printf("%d已出队\n",e);
  65. }
  66. else {
  67. printf("队已空!\n");
  68. }
  69. }
  70. }//出队操作
  71. int main() {
  72. LinkQueue Q;
  73. int choice;
  74. initqueue(Q);
  75. while (1) {
  76. menu();
  77. cout << "\n输入操作编号:";
  78. cin >> choice;
  79. if (choice == 3)
  80. break;
  81. switch (choice) {
  82. case 1:EnterToQueue(Q); break;
  83. case 2:DeleteFromQueue(Q); break;
  84. default:printf("超出范围!\n");
  85. }
  86. }
  87. return 0;
  88. }

有误请指正

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

闽ICP备14008679号