在开始之前我们做如下约定:

队空: front == rear

队满: (Q.rear + 1) % MaxSize == Q.front

求循环队列的长度: (Q.rear - Q.front + MaxSize) %  MaxSize

入队:Q.rear = (Q.rear + 1) % MaxSize

出队: Q.front = (Q.front + 1) % MaxSize

 

#include <iostream>
#include <cstdlib>
using namespace std;
#define MaxSize 100     // 队列的最大容量

typedef struct Queue{
	int *base;
	int front;      // 队首指针
	int rear;       // 队尾指针
} Queue;
bool Init(Queue &Q)
{
	Q.base = new int[MaxSize];	// 分配空间
	if( !Q.base)
		return false;
	Q.front = Q.rear = 0;       // 初始队首和队尾指向同一个位置
	return true;
}
int QueueSize(const Queue &Q)  // 返回队列的大小
{
	return (Q.rear - Q.front + MaxSize) % MaxSize;
}
bool EnQueue(Queue &Q, int e)       // 进队
{
	if((Q.rear + 1) % MaxSize == Q.front)	// 队满判定
		return false;
	Q.base[Q.rear] = e;	// 新元素插入队尾
	Q.rear = (Q.rear + 1) % MaxSize;	// 队尾指针加一并保持循环特性
	return true;	// 返回操作状态
}
bool DeQueue(Queue &Q)  // 出队
{
	if(Q.rear == Q.front)
		return false;
	//e = Q.base[Q.front];
	Q.front = (Q.front + 1) % MaxSize;
	return true;
}
int GetHead(Queue Q)        // 获得队首元素
{
	if(Q.front != Q.rear)	// 队列非空
		return Q.base[Q.front];
}

int main()
{
    int n;
    Queue Q;    // 定义
    Init(Q);    // 初始化
    while(cin >> n)     // 以下为测试程序的正确性代码
    {
        for(int i=0; i<n; i++)
            EnQueue(Q, i);
        cout << "The size of Queue is: " << QueueSize(Q) << endl;
        cout << "The head is: " << GetHead(Q) << endl;
        DeQueue(Q);
        cout << "The head is: " << GetHead(Q) << endl;
    }




	return 0;
}