c++实现循环队列
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c++实现循环队列,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2961字,纯文字阅读大概需要5分钟。
内容图文
队列(queue)是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。
允许插入的一端称为队尾,允许删除的一端称为队头。
因为已经限制了插入和删除的位置,所以对于队列,插入和删除时只需要考虑满和空两种状态
顺序队列的操作分别在队头和队尾两端进行。在出队时,队头_front和队尾_rear的值都是只增加(向队列长度_size)靠近;如果仅通过_rear == _size来判断顺序队列是否满队,此时可能存在_rear已经指向_size,同时_front > 0(已有元素出队),顺序队列中实际的元素个数远小于_size而不能做入队操作的情况,导致元素出队后的空闲存储空间永远无法重用,造成假上溢。如下图:
此时再添加元素 _rear 就超出大小 但已经有出队元素 造成前面空间浪费因此让_rear跑的0号位置 实现循环
所以
_front=(_front+1)%_size _rear=(_rear+1)%_szie 实现循环
因此可以看成一个圆环进行存储
通过分析要实现这个循环队列需要成员变量有
int * _pQue; //指向申请的kongjianint _front; // 队头int _rear; //队尾int _size //记录空间的大小
封装在类中实现为
1 #include<iostream> 2 #include<stdlib.h> 3 #include<string.h> 4usingnamespace std; 5 6class Queue 7{ 8public: 9 Queue(int size=10) // 构造函数 10 { 11 _pQue=newint[size]; 12 _front=0; 13 _rear=0; 14 _size=size; 15 } 16 ~Queue() //析构函数 17 { 18delete []_pQue; 19 _pQue=nullptr; 20 } 21 Queue(const Queue &que) //拷贝构造函数(防止浅拷贝) 22 { 23 _PQue=newint[que._size]; 24int i=que._front; 25for(;i!=que._rear;i=(i+1)%que._size) 26 { 27 _pQue[i]=que._pQue[i]; 28 } 29 _front=que._front; 30 _rear=que._rear; 31 _size=que._size; 32 } 33 Queue & operator=(const Queue &que) //赋值构造函数 返回地址 可以实现连续赋值 34 { 35if(this==&que) 36 { 37return *this; 38 } 39delete []_pQue; 40 _pQue=newint[que._size]; 41int i=que._front; 42for(;i!=que._rear;i=(i+1)%que._size) 43 { 44 _pQue[i]=que._pQue[i]; 45 } 46 _front=que._front; 47 _rear=que._rear; 48 _size=que._szie; 49return *this; 50 } 51 Queue(Queue &&que) //右值拷贝函数 防止临时量对空间时间的浪费 52 { 53 _pQue=que._pQue; 54 _front=que._front; 55 _rear=que._rear; 56 _size=que._size; 57 que._pQue=nullptr; 58 } 59 Queue & operator=(Queue &&que) // 右值赋值构造函数 防止临时量对空间时间的浪费 60 { 61delete []_pQue; 62 _pQue=que._pQue; 63 _front=que._front; 64 _rear=que._rear; 65 _size=que._size; 66 que._pQue=nullptr; 67return *this; 68 } 69void addQue(int val) //队尾插入 70 { 71if(full()) 72 { 73 resize(); 74 } 75 _pQue[_rear]=val; 76 _rear=(_rear+1)%_size; 77 } 78void delQue() // 出队 79 { 80if(empty()) 81 { 82return; 83 } 84 _front=(_front+1)%_size; 85 86 } 87int front() // 返回队头元素 88 { 89return _pQue[_front]; 90 } 91int back() //返回队尾元素 92 { 93return _pQue[_rear-1+_size]%_size; 94 } 95bool empty() // 是否队空 96 { 97return _front==_rear; 98 } 99bool full() // 是否对满 100 { 101return (_rear+1)%_size==_front; 102 } 103private: 104int *_pQue; //指向申请的空间地址 105int _front; // 队头 106int _rear; // 队尾 107int _size; // 空间大小 108void resize() // 2倍扩容函数 109 { 110int *tmp=newint[_size*2]; 111int i=_front; 112int j=0; 113for(i;i!=_rear;i=(i+1)%_size) 114 { 115 tmp[j++]=_pQue[i]; 116 } 117 _front=0; 118 _rear=j; 119delete []_pQue; 120 _pQue=tmp; 121 tmp=nullptr; 122 _size*=2; 123 } 124 }; 125int main() 126{ 127 Queue st1(5); 128int i=0; 129for(;i<10;i++) 130 { 131 st1.addQue(i); 132 cout<<st1.front()<<endl; 133 st1.delQue(); 134 } 135 cout<<endl; 136return0; 137} 138
原文:https://www.cnblogs.com/lc-bk/p/11571824.html
内容总结
以上是互联网集市为您收集整理的c++实现循环队列全部内容,希望文章能够帮你解决c++实现循环队列所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。