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

#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!\n");
}
} 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!\n");
return ;
}
} template<typename T>
T MsgQueue<T>::getFront()
{
if(isEmpty())
{
printf("The queue is empty!\n");
}
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文件中。

最新文章

  1. 「Poetize9」礼物运送
  2. PHP面试题(二)
  3. Case of the Zeros and Ones
  4. poj 3263 Tallest Cow
  5. 安装VMWare WorkStation 10 异常【 Failed to create the requested registry keyKey:Installer Error: 1021】
  6. 关于EasyUI中DataGrid控件的一些使用方法总结
  7. Python-数据类型-转摘
  8. 《Thinking in Java》学习笔记(二)
  9. Java学习之JDBC 2019/3/10
  10. 11175-From D to E and Back(思维)
  11. springboot 文件上传大小配置
  12. 转载:浅谈 Scala 中下划线的用途
  13. React JSX基本语法规则
  14. 盗COOKIE之方法总结
  15. linux消息队列应用编程
  16. shell习题第1题:每日一文件
  17. 经常使用meta标签属性
  18. Vector3函数理解-计算两向量之间的角度
  19. elasticsearch中的filter与aggs
  20. ListView 动态生成 Header

热门文章

  1. 计算机网络——TCP与UDP协议详解
  2. centos下使用nohup
  3. Loadrunner模拟Json请求
  4. 食物链-HZUN寒假集训
  5. 陪你解读Spring Batch(一)Spring Batch介绍
  6. js基础复习点
  7. slice 与 splice 的区别
  8. 使用mongodb的一些笔记
  9. js兼容公用方法
  10. [kuangbin带你飞]专题一 简单搜索(回顾)
  11. java validate date
  12. [转]GDB-----1.GDB概述
  13. FireMonkey 源码学习(4)
  14. R.java的生成规则
  15. JVM 运行时数据区详解
  16. CSS 天坑 I - 字体单位
  17. AC自动机练习
  18. HDFS pipeline写 -- datanode
  19. Linux端口占用
  20. [19/04/08-星期一] 多线程_线程的优先级(Priority) 和 守护线程(Daemon)