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

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. UITextfield设置Placeholder颜色 控件 内边距、自适应高度

    //创建UITextField对象 UITextField * tf=[[UITextField alloc]init];    //设置Placeholder颜色 [text setAttribut ...

  2. 金蝶K3 破解版

  3. requestCode 和 resultCode .

    OK,代码如上,可能这个时候还会有点疑问,关于参数的疑问.直接看android sdk 帮助说得更清楚.我发现网上有些文章还有吧 requestCode 和 resultCode 混淆说明错的. st ...

  4. velocity properties

    resource.loader=webapp webapp.resource.loader.class=org.apache.velocity.tools.view.servlet.WebappLoa ...

  5. docker no permmition problem

    resolved by: sudo docker run --privileged ....

  6. Android 自学之基本界面组件(上)

    文本款(TextView)和编辑框(EditText)的功能和用法 TextView直接继承了View,他还是EditText.Button两个UI组件的父类,TextView的作用就是在界面上显示文 ...

  7. git 配置用户名和邮箱

    在安装了git for windows之后,个人总是忘记配置git config的命令,以此记录一下: 配置用户名和邮箱的命令 git config --global user.name " ...

  8. JAVA问问

    一.java中的类和方法 java是面向对象的 类就可以看做一个对象 属性是这个对象拥有什么 方法是这个对象可以做什么 Eg: 类:Person 属性:eyes mouth 方法:eat 解释: Pe ...

  9. JDBC的几个步骤

    JDBC:JAVA访问数据库的解决方案.几个步骤:1.加载驱动类; 2.与数据库建立连接:         3.执行SQL语句   4.处理结果集 5.关闭连接1. 第一步:加载驱动类: 需要注意:不 ...

  10. gd库复制图片做水印

    将复制源图片的某个位置复制到目标图片中,不能调整大小 imagecopy(目标图片画布,复制源画布,目标画布左上角x,y,源画布左上角x,y,复制图片的宽,高); 允许调整大小 imagecopyre ...