循环队列

为了克服普通队列的“假溢出”缺点,使用循环队列,用一个数组来模拟圆环,到达末尾后利用取模运算重新回到队首。

实现:

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;
}

 

posted @ 2020-03-24 22:57  NeoZy  阅读(318)  评论(0编辑  收藏  举报