当前位置:   article > 正文

顺序队列和链队列(Queue模板)_定义队列类模板queue

定义队列类模板queue

目录

模板:相关讲解

一、队列

1.定义:

2.储存方式:

3.基本操作:

二、判断顺序队列队满的三种方法

三、基本操作: 

1.声明

        2.初始化数据   

        3.入队 

        4.出队

        5.判断队满和队空

        6.获得栈顶元素

        7.清空队列

         8.显示队列数据

四、模板(自制) 

1.顺序队列

2.链队列


模板:相关讲解

一、队列

1.定义:

只允许在一端进行插入操作,而另一端进行删除 操作的线性表。

顺序队列

 链队列

  

2.储存方式:

顺序储存和链式储存

3.基本操作:


   1)   CirQueue(int m_size): 建立长度为size的队列
   2)  bool enQueue(T item): 入队
   3)  bool deQueue(T* item): 出队
   4)  bool getFront(T* item): 读取队头元素,但不删除
   5)  bool isEmpty(): 判断队列是否为空
   6)  bool isFull(): 判断队列是否为满(如果是链队列就不需要判断)
   7)  void clearQueue(): 清空队列
   8)void displayQueue() : 显示队列内容
   9)int queueLength(): 获取队列元素个数

二、判断顺序队列队满的三种方法

方法一:附设一个存储队列中元素个数的变量num,num=0时队空,当num=QueueSize时为队满;(这也是我喜欢采用的方式,还可以记录队列个数,在获取队列元素个数时比较方便) 

方法二:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元;

方法三:设置标志flag,front=rearflag=0时为队空,当front=rearflag=1时为队满。

三、基本操作: 

1.声明:

  顺序队列:

  1. const int Queuesize = 100;
  2. template <class T>
  3. class CirQueue
  4. {
  5. private ://顺序队列
  6. T* data;
  7. int front;
  8. int rear;
  9. int num ;
  10. int m_Size;
  11. public:
  12. CirQueue();
  13. CirQueue(int m_size);//
  14. ~CirQueue();
  15. bool enQueue(T item);
  16. bool deQueue(T* item);
  17. bool getFront(T* item);
  18. bool isEmpty();
  19. bool isFull();
  20. void clearQueue();
  21. void displayQueue();
  22. int queueLength();
  23. };

  链队列:

  1. template <class T>
  2. struct Node//定义一个结构体含有 数据 和 指针
  3. {
  4. T data;
  5. struct Node* next;
  6. };
  7. template <class T>
  8. class LinkQueue
  9. {
  10. private :
  11. int num; //还是用来记录元素个数
  12. struct Node<T>* front;
  13. struct Node<T>* rear;
  14. public:
  15. LinkQueue();
  16. ~LinkQueue();
  17. bool enQueue(T item);
  18. bool deQueue(T* item);
  19. bool getFront(T* item);
  20. bool isEmpty();
  21. void clearQueue();
  22. void displayQueue();
  23. int queueLength();
  24. };

 比较:其实变化不大,链队列不再设置队列长度,不用判断队列是否队满。

2.初始化数据   

顺序队列:

  1. template<class T>
  2. CirQueue<T>::CirQueue(int Size)
  3. {
  4. num = 0;
  5. front = rear = -1;
  6. data = new T[Size];
  7. m_Size = Size;
  8. }

链队列: 

  1. template<class T>
  2. LinkQueue<T>::LinkQueue()
  3. {
  4. num = 0;
  5. front = new Node<T>;
  6. front->next = NULL;
  7. rear = front;
  8. }

3.入队 

顺序队列:

  1. template<class T>
  2. bool CirQueue<T>::enQueue(T item)
  3. {
  4. if (isFull()) return 0;
  5. else
  6. {
  7. rear = (rear + 1)%m_Size ;
  8. data[rear] = item;
  9. num++;
  10. return 1;
  11. }
  12. }

链队列:

  1. template<class T>
  2. bool LinkQueue<T>::enQueue(T item)
  3. {
  4. struct Node<T> *s = new struct Node<T>;
  5. s->data = item;
  6. s->next = NULL;
  7. rear->next = s;
  8. rear = s;
  9. num++;
  10. return 1;
  11. }

 4.出队

因为设定的是bool类型,所以要获得出队列的数据,需要通过一个指针,来去除出对的数据

顺序队列:

  1. template<class T>
  2. bool CirQueue<T>::deQueue(T* item)
  3. {
  4. if (isEmpty()) return 0;
  5. else
  6. {
  7. front = (front + 1) % m_Size;
  8. *item = data[front];
  9. num--;
  10. return 1;
  11. }
  12. }

链队列:

 当时最后一个数据时

if (p->next == NULL)//只有一个元素(边界情况)
            rear = front;

  1. template<class T>
  2. bool LinkQueue<T>::deQueue(T* item)
  3. {
  4. if (isEmpty()) return 0;
  5. else
  6. {
  7. struct Node<T>* p;
  8. p = front->next;
  9. *item = p->data;
  10. front->next = p->next;
  11. if (p->next == NULL)//只有一个元素(边界情况)
  12. rear = front;
  13. delete p;
  14. num--;
  15. return 1;
  16. }
  17. }

5.判断队满和队空

 顺序队列:

    此时就用到初始定义其用的 num,如果num = 0,代表队列里没有数据,无法出队和获得队首数据。如果num = m_Size,说明队列满了,不能再进队了。

  1. template<class T>
  2. bool CirQueue<T>::isEmpty()
  3. {
  4. if (num == 0) return 1;
  5. else return 0;
  6. }
  7. template<class T>
  8. bool CirQueue<T>::isFull()
  9. {
  10. if (num == m_Size) return 1;
  11. else return 0;
  12. }

链队列:

  1. template<class T>
  2. bool LinkQueue<T>::isEmpty()
  3. {
  4. if (num == 0) return 1;
  5. else return 0;
  6. }

 6.获得栈顶元素

顺序队列:

  1. template<class T>
  2. bool CirQueue<T>::getFront(T* item)
  3. {
  4. int i;
  5. if (isEmpty()) return 0;
  6. i = (front+1)%m_Size;
  7. *item = data[i];
  8. return 1;
  9. }

链队列: 

  1. template<class T>
  2. bool LinkQueue<T>::getFront(T* item)
  3. {
  4. if (isEmpty()) return 0;
  5. *item = (front->next)->data;
  6. return 1;
  7. }

 7.清空队列

顺序队列:

  1. template<class T>
  2. void CirQueue<T>::clearQueue()
  3. {
  4. delete[]data;
  5. }

链队列:

  1. template<class T>
  2. void LinkQueue<T>::clearQueue()
  3. {
  4. while (front!= NULL)
  5. {
  6. struct Node<T>* p = front->next;
  7. if (p->next == NULL)//只有一个元素(边界情况)
  8. {
  9. rear = front;
  10. break;
  11. }
  12. else
  13. front->next = p->next;
  14. delete p;
  15. num--;
  16. }
  17. }

 8.显示队列数据

顺序链表:

  1. template<class T>
  2. void CirQueue<T>::displayQueue()
  3. {
  4. int i = (front + 1) % m_Size;
  5. cout << "队列从队首到队尾数据依次为:" << endl;
  6. for ( ; i < m_Size; i++)
  7. {
  8. cout << " " << data[i]<<" " << endl;
  9. }
  10. }

链队列:

  1. template<class T>
  2. void LinkQueue<T>::displayQueue()
  3. {
  4. struct Node<T>*p = front->next;
  5. cout << "队列从队首到队尾数据依次为:" << endl;
  6. while(p)
  7. {
  8. cout << " " << p->data <<" " << endl;
  9. p = p->next;
  10. }
  11. }

四、模板(自制) 

1.顺序队列

  1. #include<iostream>
  2. using namespace std;
  3. const int Queuesize = 100;
  4. template <class T>
  5. class CirQueue
  6. {
  7. private:
  8. T* data;
  9. int front;
  10. int rear;
  11. int num;
  12. int m_Size;
  13. public:
  14. CirQueue();
  15. CirQueue(int m_size);
  16. ~CirQueue();
  17. bool enQueue(T item);
  18. bool deQueue(T* item);
  19. bool getFront(T* item);
  20. bool isEmpty();
  21. bool isFull();
  22. void clearQueue();
  23. void displayQueue();
  24. int queueLength();
  25. };
  26. template<class T>
  27. CirQueue<T>::CirQueue(int Size)
  28. {
  29. num = 0;
  30. front = rear = -1;
  31. data = new T[Size];
  32. m_Size = Size;
  33. }
  34. template<class T>
  35. CirQueue<T>::~CirQueue()
  36. {
  37. clearQueue();
  38. delete front;
  39. }
  40. template<class T>
  41. bool CirQueue<T>::enQueue(T item)
  42. {
  43. if (isFull()) return 0;
  44. else
  45. {
  46. rear = (rear + 1) % m_Size;
  47. data[rear] = item;
  48. num++;
  49. return 1;
  50. }
  51. }
  52. template<class T>
  53. bool CirQueue<T>::deQueue(T* item)
  54. {
  55. if (isEmpty()) return 0;
  56. else
  57. {
  58. front = (front + 1) % m_Size;
  59. *item = data[front];
  60. num--;
  61. return 1;
  62. }
  63. }
  64. template<class T>
  65. bool CirQueue<T>::getFront(T* item)
  66. {
  67. int i;
  68. if (isEmpty()) return 0;
  69. i = (front + 1) % m_Size;
  70. *item = data[i];
  71. return 1;
  72. }
  73. template<class T>
  74. bool CirQueue<T>::isEmpty()
  75. {
  76. if (num == 0) return 1;
  77. else return 0;
  78. }
  79. template<class T>
  80. bool CirQueue<T>::isFull()
  81. {
  82. if (num == m_Size) return 1;
  83. else return 0;
  84. }
  85. template<class T>
  86. void CirQueue<T>::clearQueue()
  87. {
  88. delete[]data;
  89. }
  90. template<class T>
  91. void CirQueue<T>::displayQueue()
  92. {
  93. int i = (front + 1) % m_Size;
  94. cout << "队列从队首到队尾数据依次为:" << endl;
  95. for (; i <m_Size; i++)
  96. {
  97. cout << " " << data[i] << " " << endl;
  98. }
  99. }
  100. template<class T>
  101. int CirQueue<T>::queueLength()
  102. {
  103. return num;
  104. }
  105. int main()
  106. {
  107. int n;
  108. int x = 0;
  109. int temp = 0;
  110. int count = 0;
  111. CirQueue<int> p1(9);
  112. int i = 0;
  113. for (; i < 9; i++)
  114. {
  115. p1.enQueue(i + 1);//入队
  116. //cout << "上一个数据是"<< x << endl;
  117. }
  118. n = p1.getFront(&temp);//获得队首元素
  119. cout << "队首数据是:" << temp << endl;
  120. n = p1.deQueue(&temp);//出队
  121. cout << "出对后的队列长度:" << p1.queueLength() << endl;//出对后的队列长度
  122. p1.displayQueue();//显示队列数据
  123. return 0;
  124. }

        结果:

  

2.链队列

  1. #include<iostream>
  2. using namespace std;
  3. //const int Queuesize = 100;
  4. template <class T>
  5. struct Node
  6. {
  7. T data;
  8. struct Node* next;
  9. };
  10. template <class T>
  11. class LinkQueue
  12. {
  13. private :
  14. int num;
  15. struct Node<T>* front;
  16. struct Node<T>* rear;
  17. public:
  18. LinkQueue();
  19. ~LinkQueue();
  20. bool enQueue(T item);
  21. bool deQueue(T* item);
  22. bool getFront(T* item);
  23. bool isEmpty();
  24. void clearQueue();
  25. void displayQueue();
  26. int queueLength();
  27. };
  28. template<class T>
  29. LinkQueue<T>::LinkQueue()
  30. {
  31. num = 0;
  32. front = new Node<T>;
  33. front->next = NULL;
  34. rear = front;
  35. }
  36. template<class T>
  37. LinkQueue<T>::~LinkQueue()
  38. {
  39. clearQueue();
  40. }
  41. template<class T>
  42. bool LinkQueue<T>::enQueue(T item)
  43. {
  44. struct Node<T> *p = new struct Node<T>;
  45. p->data = item;
  46. p->next = NULL;
  47. rear->next = p;
  48. rear = p;
  49. num++;
  50. return 1;
  51. }
  52. template<class T>
  53. bool LinkQueue<T>::deQueue(T* item)
  54. {
  55. if (isEmpty()) return 0;
  56. else
  57. {
  58. struct Node<T>* p;
  59. p = front->next;
  60. *item = p->data;
  61. if (p->next == NULL)//只有一个元素(边界情况)
  62. rear = front;
  63. else
  64. {
  65. front->next = p->next;
  66. }
  67. delete p;
  68. num--;
  69. return 1;
  70. }
  71. }
  72. template<class T>
  73. bool LinkQueue<T>::getFront(T* item)
  74. {
  75. if (isEmpty()) return 0;
  76. *item = (front->next)->data;
  77. return 1;
  78. }
  79. template<class T>
  80. bool LinkQueue<T>::isEmpty()
  81. {
  82. if (num == 0) return 1;
  83. else return 0;
  84. }
  85. template<class T>
  86. void LinkQueue<T>::clearQueue()
  87. {
  88. while (front!= NULL)
  89. {
  90. struct Node<T>* p = front->next;
  91. if (p->next == NULL)//只有一个元素(边界情况)
  92. {
  93. rear = front;
  94. break;
  95. }
  96. else
  97. front->next = p->next;
  98. delete p;
  99. num--;
  100. }
  101. }
  102. template<class T>
  103. void LinkQueue<T>::displayQueue()
  104. {
  105. struct Node<T>*p = front->next;
  106. cout << "队列从队首到队尾数据依次为:" << endl;
  107. while(p)
  108. {
  109. cout << " " << p->data <<" " << endl;
  110. p = p->next;
  111. }
  112. }
  113. template<class T>
  114. int LinkQueue<T>::queueLength()
  115. {
  116. return num;
  117. }
  118. int main()
  119. {
  120. int n;
  121. int x = 0;
  122. int temp = 0;
  123. int count = 0;
  124. LinkQueue<int> p1;
  125. int i = 3;
  126. for (; i < 9; i++)
  127. {
  128. p1.enQueue(i + 1);//入队
  129. //cout << "上一个数据是"<< x << endl;
  130. }
  131. n = p1.getFront(&temp);//获得队首元素
  132. cout << "队首数据是:" << temp << endl;
  133. n = p1.deQueue(&temp);//出队
  134. cout << "出对后的队列长度:" << p1.queueLength() << endl;//出对后的队列长度
  135. p1.displayQueue();//显示队列数据
  136. return 0;
  137. }

 结果:

思考:

约瑟夫问题 

约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

(文章创作不易,转载请声明,谢谢。文章仅仅是个人总结,如有错误,还请大佬指出,如果有什么不恰当的地方,也欢迎在评论区讨论)

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

闽ICP备14008679号