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

其實就是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; }
