#include<iostream>
using namespace std;
const int MAXQSIZE = 5;
//队列类
template<class T>
struct LinkList
{
T * data;//指向连续的数据存储区域
int front;//头指针 指向第一个元素
int rear;//尾指针 假设队列不为空指向最后元素的下一个位置
};
//构造一个空队列
template<class T>
void InitQueue(LinkList<T> & que)
{
que.data = (T *)malloc(MAXQSIZE*sizeof(T));
if(!que.data) exit(0);
que.front = que.rear= 0;
}
//销毁队列
template<class T>
void DestroyQueue(LinkList<T>& que)
{
free(que.data);
}
//清空队列
template<class T>
void ClearQueue(LinkList<T>& que)
{
que.front = que.front= 0;
}
//返回队列的长度
template<class T>
int QueueLength(LinkList<T>& que)
{
return (que.rear - que.front + MAXQSIZE)%MAXQSIZE;
}
//返回队列的队首元素
template<class T>
T GetHead(LinkList<T>& que)
{
if(que.front==que.rear)
throw runtime_error("");
return que.data[que.front];
}
//元素入队
template<class T>
bool EnQueue(LinkList<T>& que,T t)
{
if((que.rear+1)%MAXQSIZE == que.front)
{
return false;
}
que.data[que.rear] = t;
que.rear = (que.rear+1)%MAXQSIZE;
return true;
}
//元素出队
template<class T>
bool DeQueue(LinkList<T>& que,T & t)
{
if(que.front==que.rear)
return false;
t = que.data[que.front];
que.front = (que.front + 1)%MAXQSIZE;
return true;
}
//从对头到队尾元素遍历调用visit函数
template<class T>
void VisitQueue(LinkList<T>& que,void (*visit)(T &t))
{
int p = que.front;
while (p!=que.rear)
{
(*visit)(que.data[p]);
p = (p+1)%MAXQSIZE;
}
}
//測试函数
template<class T>
void Print(T &t)
{
cout<<t<<endl;
}
template<class T>
void AddOne(T &t)
{
t++;
}
int main()
{
//创建一个空的队列
LinkList<int> queue;
//初始化队列
InitQueue(queue);
//元素入队
EnQueue(queue,1);
EnQueue(queue,2);
EnQueue(queue,3);
EnQueue(queue,4);
//返回队列的长度
cout<<"队列的长度: "<<QueueLength(queue)<<endl;
//输出全部元素
VisitQueue(queue,Print<int>);
//返回队列的队首元素
cout<<"队列的队首元素: "<<GetHead(queue)<<endl;
//元素出队
int a ;
if(DeQueue(queue,a))
{
cout<<"出队元素: "<<a<<endl;
}
//返回队列的长度
cout<<"队列的长度: "<<QueueLength(queue)<<endl;
//输出全部元素
VisitQueue(queue,Print<int>);
//元素出队
if(DeQueue(queue,a))
{
cout<<"出队元素: "<<a<<endl;
}
//返回队列的长度
cout<<"队列的长度: "<<QueueLength(queue)<<endl;
//输出全部元素
VisitQueue(queue,Print<int>);
//元素入队
EnQueue(queue,5);
EnQueue(queue,6);
cout<<"5、6元素入队"<<endl;
//返回队列的长度
cout<<"队列的长度: "<<QueueLength(queue)<<endl;
//输出全部元素
VisitQueue(queue,Print<int>);
//将全部元素加一
cout<<"将全部元素加一"<<endl;
VisitQueue(queue,AddOne<int>);
//输出全部元素
VisitQueue(queue,Print<int>);
//清空队列
ClearQueue(queue);
//销毁队列
DestroyQueue(queue);
}