队列:一端进行插入,另一端进行删除的线性结构,具有先进先出性。利用数组来实现队列将面临“假溢出”的情况,如下图所示:

front:永远指向队首元素,队首在本文中是允许删除元素的一端

rear:永远指向队尾元素,队尾在本文中是允许插入元素的一端

所以引出循环队列,循环队列简单来说就是当rear=n时,将rear指针修改为0。

上图可形象为下图:

#include <iostream>
using namespace std; template <typename T>
class Queue{
private:
int front; //指向队列首元素
int rear; //指向队列尾元素的下一个地址
int maxSize; //队列最大长度
T *data; //保存队列元素的数组空间
int num; //队列中的元素个数
public:
Queue(int max=10):maxSize(max){ //构造函数,初始化队列
front=0;
rear=0;
num=0;
data = new T[maxSize];
}
~Queue(){
delete [] data; //释放队列空间
}
void In(T x); //向队列插入一个元素
void Out(); //队尾元素出队
T getFront() const; //获得队首元素
int getLength() const; //当前队列元素个数
bool isFull() const; //判断队列是否已满
bool isEmpty() const; //判断队列是否为空
void printAll() const; //打印队内元素
}; template <typename T>
void Queue<T>::In(T x){ //队尾插入一个元素
data[rear]=x;
rear=(rear+1)%maxSize;
num++;
} template <typename T>
void Queue<T>::Out(){ //队首元素出队
front=(front+1)%maxSize;
num--;
} template <typename T>
T Queue<T>::getFront() const{ //获得队首元素
return data[front];
} template <typename T>
int Queue<T>::getLength()const{ //当前队列元素个数
return num;
} template <typename T>
bool Queue<T>::isFull()const{ //判断队列是否已满
return num==maxSize;
} template <typename T>
bool Queue<T>::isEmpty()const{ //判断队列是否为空
return num==0;
} template <typename T>
void Queue<T>::printAll() const{
int p = front;
int i=1;
while(p!=rear){
cout<<"第"<<i<<"元素:"<<data[p]<<endl;
i++;
p = (p+1)%maxSize;
}
} void main(){
Queue<int> *a = new Queue<int>(5);
cout<<"队列是否为空:"<<a->isEmpty()<<endl; //判断队列是否为空,如果返回1则为空
a->In(1); //队尾插入一个元素值为1
a->In(2); //队尾插入一个元素值为2
a->In(3); //队尾插入一个元素值为3
a->In(4); //队尾插入一个元素值为4
a->In(5); //队尾插入一个元素值为5
cout<<"队列是否已满:"<<a->isFull()<<endl; //判断队列是否已满,如果返回1则表示队列已满
cout<<"队列元素个数:"<<a->getLength()<<endl;
a->Out(); //队首元素出队
cout<<"队列元素个数:"<<a->getLength()<<endl<<endl;
a->printAll(); //打印队内元素
}

运行结果:

队列(顺序存储)C++模板实现的更多相关文章

  1. [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...

  2. [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)

    循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...

  3. 队列顺序存储 - 设计与实现 - API函数

    队列是一种特殊的线性表 队列仅在线性表的两端进行操作 队头(Front):取出数据元素的一端 队尾(Rear):插入数据元素的一端 队列不允许在中间部位进行操作! queue常用操作 销毁队列 清空队 ...

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

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

  5. C 队列顺序存储

    #ifndef __MY_SEQLIST_H__ #define __MY_SEQLIST_H__ typedef void SeqList; typedef void SeqListNode; // ...

  6. SPOJ - ADALIST,双端队列入门模板!

    ADALIST - Ada and List 这道题时限6.5s,激动人心啊,好多人STL一顿乱写AC,哈哈,如果熟悉双端队列的话这道题其实是很水的. 题意:n个数的数列,然后接下来Q次操作,每次可以 ...

  7. C++标准库类模板(stack)和 队列(queue)

    在C++标准库(STL)中有栈和队列的类模板,因此可以直接使用 1.栈(stack):使用栈之前,要先包含头文件 : #include<stack> stack.push(elem); / ...

  8. 基于python实现顺序存储的队列代码

    """ 队列-顺序存储 seqqueue.py 代码实现 """ # 自定义异常类 class QueueError(Exception): ...

  9. (转)java redis使用之利用jedis实现redis消息队列

    应用场景 最近在公司做项目,需要对聊天内容进行存储,考虑到数据库查询的IO连接数高.连接频繁的因素,决定利用缓存做. 从网上了解到redis可以对所有的内容进行二进制的存储,而java是可以对所有对象 ...

  10. C++ 并发消息队列

    C++ 并发消息队列 在网上找到了一份POSIX线程显示的并发消息队列示例代码: http://codereview.stackexchange.com/questions/41604/thread- ...

随机推荐

  1. 更改OS序列号(slmgr)

    slmgr /ipk 489j-abc-def-hij-mnn slmgr /skms 8.8.8.8:1688 slmgr /ato

  2. .TextOut文字保存为图片

    //Canvas.TextOut文字保存为图片 //Delphi开发案例精选,使用TextOut在画布上画图procedure TForm1.Button1Click(Sender: TObject) ...

  3. 征服 Nginx + Tomcat

    2年前一直折腾Apache,现如今更习惯Nginx. 搭建网站又遇到2年前遇到的问题——Session同步. (参考我以前的帖子——征服 Apache + Tomcat)只不过现今担当负载均衡的Apa ...

  4. android学习日记19--四大组件之Services(服务)

    一个Android应用主要由四个基本组件组成,Android四大基本组件分别是Activity,Content Provider内容提供者,Service服务,BroadcastReceiver广播接 ...

  5. wcf-1

    1.WCF是什么? WindowsCommunication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,它是.NET框架的一部分,由.NET Framework 3. ...

  6. js hash字符串转成json

    var a='account.type=1&account.id=&account.dependFlag=0&account.card.companyId=1&acco ...

  7. 二、Socket之UDP异步传输文件

    上一篇文章一.Socket之UDP异步传输文件中,实现了文件的基本传输,但是传输过程中的信息是看不到的,这一篇是对上一篇进行了一些改进,并且可以了解传输的信息(加入了Log),还加入了接收或者拒绝接收 ...

  8. 【转】使用Beaglebone Black的I2C (二)——使用C语言和i2c-dev驱动

    在本博客的<使用Beaglebone Black的I2C(一)>中,介绍了BBB上无需编程对i2c总线进行读写操作的方法,本文将介绍如何在c语言程序中使用i2c-dev驱动来操作i2c设备 ...

  9. oracle字段类型

    oracle 字段类型CHAR    固定长度字符串    最大长度2000    bytes              VARCHAR2    可变长度的字符串    最大长度4000    byt ...

  10. Spring3之MVC

    模式-视图-控制器(MVC)是UI设计中常见的设计模式, 该模式区分应用程序中的模式.视图和控制器三个角色,消除了业务逻辑与UI的耦合.模式负责封装视图展示的应用数据.视图应该只显示数据,不包含任何业 ...