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

#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文件中。

基于数组的循环队列(C++模板实现)的更多相关文章

  1. 用OC基于数组实现循环队列

    一.简言 使用数组实现循环队列时,始终会有一个空余的位置预留着,作为一个判决队列已满的条件(当然也可以采用其他方式).在前面已经用C++介绍了基本的算法,可以去回顾一下https://www.cnbl ...

  2. 教你如何使用Java手写一个基于数组实现的队列

    一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...

  3. C语言实现使用动态数组实现循环队列

    我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作. 因为数组的大小已经被指定.无法动态的扩展. 所以在这篇博客中,我换成动态数组来实现. 动态数组能 ...

  4. Java数组实现循环队列的两种方法

    用java实现循环队列的方法: 1.添加一个属性size用来记录眼下的元素个数. 目的是当head=rear的时候.通过size=0还是size=数组长度.来区分队列为空,或者队列已满. 2.数组中仅 ...

  5. 数组模拟循环队列(java实现)

    1.front变量的含义:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素front的初始值=0. 2.rear变量的含义:rear指向队列的最后一个元素的后一个位置 ...

  6. 深入理解循环队列----循环数组实现ArrayDeque

    我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势.此处我们将要介绍的循环队列其实是队列的一种具体实现,由于一般的数组实现的队列结构 ...

  7. 用数组实现队列(顺序队列&循环队列)

    用数组实现队列(顺序队列&循环队列) 顺序队列 ️ 队列(先进先出) 几个问题: 队列方法:入队.出队 队列的存储:即队首队尾两个指针, 扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了 ...

  8. C++学习笔记50:队列类模板

    队列是只能向一端添加元素,从另一端删除元素的线性群体 循环队列 在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组开头. 队列类模板 //Queue.h ...

  9. java数据结构---循环队列

    #java学习经验总结------循环队列的实现(数组) package datastructure;/*数组实现循环队列 队列first in first out*/ public class Ci ...

随机推荐

  1. excel怎么比较两组或两列数据的相同项和不同项

    https://jingyan.baidu.com/article/c843ea0b7a2a7477921e4a47.html

  2. java实现Excel数据导出

    java实现Excel数据导出: 目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel Jakarta POI 是一套用于访问微软格式文档的Java ...

  3. 【Linux】排序命令sort

    很多时候,我们都会去计算一次数据里头的相同型态的数据总数,举例来说, 使用 last 可以查得这个月份有登陆主机者的身份.那么我可以针对每个使用者查出他们的总登陆次数吗? 此时就得要排序与计算之类的命 ...

  4. 二十二、Linux 进程与信号---进程创建(续)

    22.2 父子进程操作文件 文件操作由两种模式: IO 系统调用操作文件 标准C IO 操作文件 看代码: #include <unistd.h> #include <string. ...

  5. 基于时间的 SQL注入研究

    SQL注入攻击是业界一种非常流行的攻击方式,是由rfp在1998年<Phrack>杂志第54期上的“NT Web Technology Vulnerabilities”文章中首次提出的.时 ...

  6. alexnet- tensorflow

    alexnet 在 imagenet上夺冠是卷积神经网络如今这么火热的起点. 虽然卷积神经网络很早就被提出来,但是由于计算能力和各方面原因,没有得到关注. alexnet 为什么能取得这么好的成绩,它 ...

  7. 最大似然概率(MLE)和最大后验概率(MAP)

    https://blog.csdn.net/u011508640/article/details/72815981

  8. oracle 存储过程(包)的写法和执行

    --in 代表输入参数,out 代表输出参数create or replace procedure myproc(id in int, v_message out varchar2) is--定义临时 ...

  9. python的sys.args使用

    一.sys 模块 sys是Python的一个「标准库」,也就是官方出的「模块」,是「System」的简写,封装了一些系统的信息和接口. 官方的文档参考:https://docs.python.org/ ...

  10. 浅谈linux线程切换问题

    http://www.jb51.net/article/102059.htm 处理器总处于以下状态中的一种: 1.内核态,运行于进程上下文,内核代表进程运行于内核空间 2.内核态,运行于中断上下文,内 ...