首页 > 编程语言 > 详细

数据结构与算法-循环队列

时间:2019-10-17 14:38:29      阅读:58      评论:0      收藏:0      [点我收藏+]

在顺序队列出队列的时候,数组前面会有空余的空间,我们可以将数据往前搬移,提高空余空间的使用,但是效率比较低;我们可以使用循环队列来提高效率。

Head代表队列头,Tail代表队列尾,n代表队列的长度,如果Head与Tail大于等于n的时候就是到了循环点,可以将Head或者Tail余n来代表当前n内的位置。


一开始空余的循环队列,Head和Tail的位置

技术分享图片

当有四个元素(a,b,c,d)入队,Head和Tail的位置

技术分享图片

当所有元素出队后,Head与Tail是相等的,就是空队列

技术分享图片

当满队列,Head和Tail的位置,可以看到Tail的位置是空余的,如果再加入一个元素的话就导致head与tail相等,判断条件是(Tail + 1) % n==Head

技术分享图片


 

代码实现

template<class T>
class MyCircularQueue {
public:
    MyCircularQueue(int nQueueSize);
    ~MyCircularQueue();

    bool empty() const;
    int size() const;
    void pop();
    T front() const;
    T back() const;
    bool push(T const&);

protected:
    T* m_pArrayQueue;
    int m_nQueueSize;
    int m_nHead;
    int m_nTail;
    int m_nNumSize;
};

template<class T>
MyCircularQueue<T>::MyCircularQueue(int nQueueSize) {
    m_nQueueSize = nQueueSize;
    m_pArrayQueue = new T[nQueueSize];
    m_nHead = 0;
    m_nTail = 0;
    m_nNumSize = 0;
}

template<class T>
MyCircularQueue<T>::~MyCircularQueue() {
    delete[] m_pArrayQueue;
}

template<class T>
bool MyCircularQueue<T>::empty() const {
    if(m_nHead == m_nTail) {
        return true;
    }
    return false;
}

template<class T>
int MyCircularQueue<T>::size() const {
    return m_nNumSize;
}

template<class T>
void MyCircularQueue<T>::pop() {
    if(m_nHead == m_nTail) {
        return ;
    }
    m_nHead = (m_nHead + 1) % m_nQueueSize;
    m_nNumSize--;
}

template<class T>
T MyCircularQueue<T>::front() const {
    return m_pArrayQueue[m_nHead];
}

template<class T>
T MyCircularQueue<T>::back() const {
    return m_pArrayQueue[(m_nHead + m_nNumSize - 1) % m_nQueueSize];
}

template<class T>
bool MyCircularQueue<T>::push(T const& param) {
    if((m_nTail + 1) % m_nQueueSize == m_nHead) {
        return false;
    }
    m_pArrayQueue[m_nTail] = param;
    m_nTail = (m_nTail + 1) % m_nQueueSize;
    m_nNumSize++;
    return true;
}

技术分享图片

可关注公众号"程序员的面试题",了解更多的面试技巧

数据结构与算法-循环队列

原文:https://www.cnblogs.com/yew0/p/11691534.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!