#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); }
循环顺序队列
时间: 2024-11-02 23:52:26