在开始之前我们做如下约定:
队空: 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;
}