当前位置:   article > 正文

C++:队列_c++队列

c++队列

队列是一种操作受限的特殊线性表,插入只允许在队尾进行,删除只允许在队头进行。

队列的基本数据有队头指针队尾指针数据储存数组最大长度

队列的基本操作init(构造)、flush(销毁)、empty(判空)、full(判满)、push(数据插入队尾)、pop(删除队头数据)、clear(清空数据)、size(当前长度)、front(获取队头元素)

根据储存方式的不同,可以分为顺序队列和链式队列。

一、顺序队列

数据:队头、队尾指针,存储数组,最大容量

顺序队列就是使用顺序处存放室储存的队列,可以用结构体或者类来进行实现。

队头指针和队尾指针均使用整型序号实现,数据储存数组直接使用数组实现。

使用结构体构造顺序队列/循环队列
  1. #include<iostream>
  2. using namespace std;
  3. //简单队列
  4. struct cQueue
  5. {
  6. int *a;
  7. int maxSize;
  8. int front, rear;
  9. };
  10. void init(cQueue* q, int sz)
  11. {
  12. q->a = new int[sz];
  13. q->maxSize = sz;
  14. q->front = q->rear = 0;
  15. }
  16. void flush(cQueue* q)
  17. {
  18. delete q->a;
  19. }
  20. bool empty(cQueue* q)
  21. {
  22. return q->front == q->rear;
  23. }
  24. bool full(cQueue* q) // 循环队列 front = (rear + 1) % maxSize
  25. {
  26.  return q->rear == q->maxSize;
  27. }
  28. void clear(cQueue* q)
  29. {
  30. q->front = q->rear = 0;
  31. }
  32. int size(cQueue* q) // 循环队列 (rear + maxSize - front) % maxSize
  33. {
  34. return q->rear - q->front;
  35. }
  36. bool push(cQueue* q, int x)
  37. {
  38. if(full(q)) return 0;
  39. q->a[q->rear++] = x; //循环队列 rear = (rear+1) % maxSize;
  40. return 1;
  41. }
  42. void pop(cQueue* q)
  43. {
  44. q->front++; //循环队列 front = (front+1) % maxSize;
  45. }
  46. int front(cQueue* q)
  47. {
  48. return q->a[q->front];
  49. }
  50. //测试队列
  51. int main()
  52. {
  53. cQueue q;
  54. init(&q, 100);
  55. for(int i=1; i<=10; i++) push(&q, i);
  56. cout<<size(&q)<<endl;
  57. while(size(&q))
  58. {
  59. cout<<front(&q)<<" ";
  60. pop(&q);
  61. }
  62. return 0;
  63. }
使用类构造循环队列/顺序队列
  1. #include<iostream>
  2. using namespace std;
  3. // 循环队列
  4. class cQueue
  5. {
  6. int head, rear, maxSize;
  7. int *a;
  8. public:
  9. cQueue(int sz);
  10. ~cQueue() {delete a;}
  11. bool empty();
  12. bool full();
  13. int size();
  14. int front();
  15. void pop();//删除队头元素
  16. void push(int x);
  17. };
  18. cQueue::cQueue(int sz)
  19. {
  20. head = rear = 0;
  21. maxSize = sz;
  22. a = new int[sz];
  23. }
  24. bool cQueue::empty()
  25. {
  26. return head == rear;
  27. }
  28. bool cQueue::full()
  29. {
  30. return head == (rear + 1) % maxSize; // 简单队列 rear == maxSize
  31. }
  32. int cQueue::size()
  33. {
  34. return (rear - head + maxSize) % maxSize; // 简单队列 return rear - front
  35. }
  36. void cQueue::push(int x)
  37. {
  38. a[rear++] = x;
  39. rear %= maxSize; // 简单队列仅有第一行
  40. }
  41. int cQueue::front()
  42. {
  43. return a[head];
  44. }
  45. void cQueue::pop()
  46. {
  47. head++;
  48. head %= maxSize; // 简单队列仅有第一行
  49. }
  50. //循环队列的正确性测试
  51. int main()
  52. {
  53. cQueue q(100);
  54. for(int i=1; i<=15; i++) // i<=15再测试一次
  55. q.push(i);
  56. while(q.size())
  57. {
  58. cout<<q.front()<<" ";
  59. q.pop();
  60. }
  61. return 0;
  62. }

二、链式队列

节点数据:存储数据、向下指针

队列数据:队头、队尾指针,节点数量

链式队列清空数据就直接销毁节点了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. template <class T>
  4. class cNode //单链表节点类.简单起见,成员均为public
  5. {
  6. public:
  7. T data; //数据域
  8. cNode<T> *next; //指向下一个结点
  9. cNode(const T& item)
  10. {
  11. data = item; next = NULL;
  12. }
  13. ~cNode() { }
  14. };
  15. template<class T>
  16. class cQueue
  17. {
  18. cNode<T> * head, rear;
  19. int count;
  20. public:
  21. cQueue()
  22. {
  23. head = rear = NULL;
  24. count = 0;
  25. }
  26. ~cQueue()
  27. {
  28. clear();
  29. }
  30. bool empty()
  31. {
  32. return head == NULL && rear == NULL;
  33. }
  34. void push(T x)
  35. {
  36. cNode<T> * p = new cNode<T>(x);
  37. p->next = head;
  38. head = p;
  39. count++;
  40. }
  41. void pop()
  42. {
  43. cNode<T> * p = head;
  44. while(p->next != NULL)
  45. {
  46. p = p->m_next;
  47. }
  48. rear = p;
  49. delete p->next;
  50. p->next = NULL;
  51. count--;
  52. }
  53. void clear()
  54. {
  55. while(count)
  56. {
  57. cNode<T> * p = head;
  58. head = head->next;
  59. delete p;
  60. count--;
  61. }
  62. }
  63. };

三、C++自带队列类

需要引入头文件

#include<queue>

定义队列类对象,以储存int为例

queue<int> q;

队列类自带的方法,其中T为储存的数据类型

  1. bool empty(); // 如果队列为空返回1,否则返回0
  2. int size(); // 返回当前队列中元素的个数
  3. void pop(); // 删除队头元素,无返回值
  4. void push(T x); // 队尾添加元素x,无返回值
  5. T front(); // 返回队头元素
  6. T back(); // 返回队尾元素
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/975218
推荐阅读
相关标签
  

闽ICP备14008679号