zoukankan      html  css  js  c++  java
  • 基于数组的循环队列(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文件中。

  • 相关阅读:
    python爬虫,scrapy,获取响应的cookie,获取返回的cookie
    this指向
    闭包的10种形式
    nodejs 公私钥文件加密解密
    mysql基础知识
    nodejs 连接mysql 集群,开启事务,事务回滚封装
    pm2 启动eggjs,
    js身份证验证,二代身份证,大陆,权重验证,正规
    nodejs限制IP一段时间内的访问次数
    nodejs链接mysql集群,nodejs PoolCluster : Error: Too many connections
  • 原文地址:https://www.cnblogs.com/klcf0220/p/4062639.html
Copyright © 2011-2022 走看看