• 循环顺序队列


    #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);
    }

  • 相关阅读:
    Springboot默认配置文件application.properties的常见配置属性
    Springboot基础核心
    这样统计代码执行耗时,才足够优雅!
    什么原因才导致 select * 效率低下的?
    建立apk定时自动打包系统第三篇——代码自动更新、APP自动打包系统
    [LeetCode] 543. 二叉树的直径
    Mybatis源码分析(一)
    Dockerfile创建docker
    JavaScript浅析
    mac os下 vmware Fusion Linux虚拟机配置静态ip无法上网问题
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6753254.html
Copyright © 2020-2023  润新知