• 基于数组的循环队列(C++模板实现)


    循环队列使用数组实现的话,简单、方便。之前实现的队列,当尾端索引到达队列最后的时候,无论前面是否还有空间,都不能再添加数据了。循环队列使得队列的存储单元可以循环利用,它需要一个额外的存储单元来判断队列是否已满。

    #pragma once
    #ifndef MSGQUEUE_H_
    #define MSGQUEUE_H_
    
    #include "SerialApi.h"
    #include <queue>
    #include <iostream>
    using namespace std;
    
    template<typename T>
    class MsgQueue{
    public:
    	MsgQueue(size_t sz);  //构造
    	~MsgQueue();
    
    public:
    	bool isEmpty();  //判断队列是否为空
    	bool isFull();   //判断队列是否为满
    
    	void Push(T &val);   //入队操作
    	T Pop();    //出队操作
    
    
    	T getFront();
    	T getRear();
    
    	size_t getRealSize();
    private:
    	size_t front,rear,size;
    	T *data;
    };
    
    
    template<typename T>
    MsgQueue<T>::MsgQueue(size_t sz)
    {
    	rear = front = 0;
    	size  = sz + 1;
    	data = new T[size];
    }
    
    template<typename T>
    MsgQueue<T>::~MsgQueue()
    {
    	delete []data;
    }
    
    template<typename T>
    bool MsgQueue<T>::isEmpty()
    {
    	return (front == rear);
    }
    
    template<typename T>
    bool MsgQueue<T>::isFull()
    {
    	return (((rear+1) % size) == front);
    }
    
    template<typename T>
    void MsgQueue<T>::Push(T &val)
    {
    	if(!isFull())
    	{
    		data[rear] = val;
    		rear = (rear + 1) % size;
    	}
    	else
    	{
    		printf("The queue is full!
    ");
    	}
    }
    
    template<typename T>
    T MsgQueue<T>::Pop(void )
    {
    	T temp;
    	if(!isEmpty())
    	{
    		temp = data[front];
    		data[front] = NULL;
    		front = (front+1) % size;
    		return data[temp];
    	}
    	else
    	{
    		printf("The queue is empty!
    ");
    		return ;
    	}
    }
    
    template<typename T>
    T MsgQueue<T>::getFront()
    {
    	if(isEmpty())
    	{
    		printf("The queue is empty!
    ");
    	}
    	return data[front];
    }
    
    template<typename T>
    T MsgQueue<T>::getRear()
    {
    	return data[rear];
    }
    
    template<typename T>
    size_t MsgQueue<T>::getRealSize()
    {
    	size_t realSize = (rear - front + size) % size;
    	return realSize;
    }
    
    #endif //MSGQUEUE_H_
     
    	MsgQueue<int> *Q = new MsgQueue<int>(20);
    
    	for(int i=0;i<20;i++)
    	{
            Q->Push(i);
    	}
    	cout<<Q->getFront()<<endl;
    	cout<<Q->getRealSize()<<endl;

    参考链接:http://www.cnblogs.com/wxxweb/archive/2011/05/26/2059166.html

    注意:模板声明和实现要放在同一文件夹中,而不能够把声明放在了.h文件中,把实现放在了.cpp文件中。

  • 相关阅读:
    bzoj 2138: stone
    LOJ #6062. 「2017 山东一轮集训 Day2」Pair
    bzoj 5341: [Ctsc2018]暴力写挂
    UOJ #356. 【JOI2017春季合宿】Port Facility
    UOJ #357. 【JOI2017春季合宿】Sparklers
    UOJ #349. 【WC2018】即时战略
    bzoj 3600: 没有人的算术
    Codeforces 960G. Bandit Blues
    codeforces524E
    codeforces193B
  • 原文地址:https://www.cnblogs.com/klcf0220/p/4062639.html
Copyright © 2020-2023  润新知