循环队列
为了克服普通队列的“假溢出”缺点,使用循环队列,用一个数组来模拟圆环,到达末尾后利用取模运算重新回到队首。
实现:
front为队首指针,back为队尾指针。
由于队列满和队列空时front和back都相等,所以人为空一个元素。即如果队列数据结构容量为N,循环队列能容纳的有效数据为N-1。这样队列满时(装了N-1个元素),可以利用front==(back+1)%N来判断,而队列为空用front==back判断。
另外还可以用单独设置一个成员变量来记录队列实际的size的方法,这个就不实现了。下面只实现上面说的空一个元素+取余的方法:
template <typename T> class RoundQueue{ T* data; int front; int back; int N; public: RoundQueue(int n):data(nullptr),front(0),back(0){ N=n; data=new T(N); } ~RoundQueue(){ delete data; } void push(const T& val){ if(front==(back+1)%N){ return; } data[back]=val; back=(back+1)%N; } void pop(){ if(front==back){ return; } front=(front+1)%N; } T top(){ if(front==back){ return -1; } return data[front]; } int size(){ return (N+back-front)%N; } }; int main() { RoundQueue<int> p(6); p.push(1); cout<<"After push 1,size=:"<<p.size()<<endl; p.push(4); cout<<"After push 4,size=:"<<p.size()<<endl; p.pop(); cout<<"After pop,size=:"<<p.size()<<endl; p.top(); cout<<"After top,size=:"<<p.size()<<endl; return 0; }
进击的小🐴农