循環隊列實現(C++) Ring Buffer


循環隊列:隊列有着先入先出的特性。但是對於隊列如果刪除隊頭以后剩下的空間將不會被釋放,又由於隊列只能由隊尾插入這就導致
被刪除部分的空間被浪費。解決這個問題就是循環隊列。循環隊列顧名思義就是將隊列串起來形成一個類似與環的結構。如圖所示。對照着圖很容易理解:
對於原來隊列里的操作自然有不同的地方:
1.判斷滿:循環隊列的滿不再是rear=front 而是改成(rear-front+maxn)%maxn。
2.入隊操作: data[rear] = x; rear = (rear+1)%maxn;

總體思想就是不讓rear和front的值超過maxn的大小。於是就在rear和front自增時候模maxn。 

QQ截圖未命名

 

其實就是Ring Buffer

 

空隊時指針(下標)front和rear在一起都指向隊前方,當有元素進隊,則rear后移;有元素出隊,則front后移,最后,開始時分配給隊的前端不再被利用。(查看動畫演示

為了充分利用隊列,順序隊列總是做成一個邏輯上的循環隊列。


注意:空隊時rear等於front,滿隊時必須空一個位置。

 

#include <iostream>

using namespace std;

template <class T>
class cycleQueue
{
    private: 
        unsigned int m_size;
        int m_front;
        int m_rear;
        T*  m_data;
    public:
        cycleQueue(unsigned size)
            :m_size(size),
            m_front(0),
            m_rear(0)
        {   
            m_data = new T[size];
        }   

        ~cycleQueue()
        {   
            delete [] m_data;
        }   

        bool isEmpty()
        {   
            return m_front == m_rear;
        }   

        bool isFull() 
        {   
            return m_front == (m_rear + 1)%m_size;
        }   

        void push(T ele)throw(bad_exception)
        {
            if(isFull())
            {
                throw bad_exception();
            }
            m_data[m_rear] = ele;
            m_rear = (m_rear + 1)%m_size;
        }

        T pop() throw(bad_exception)
        {
            if(isEmpty())
            {
                throw bad_exception();
            }
            T tmp = m_data[m_front];
            m_front = (m_front + 1)%m_size;
            return tmp;
        }
};


int main()
{
    cycleQueue<int> q(5);
    q.push(1);
    q.push(2);
    q.push(3);
    q.push(4);
    for (int i = 0; i < 4 ; i++)
        cout << q.pop() << endl;
    q.push(5);
    q.push(5);
    q.push(5);
    cout << q.pop() << endl;
    cout << q.pop() << endl;
    cout << q.pop() << endl;
    cout << q.pop() << endl;
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM