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

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. XML和HTML中常用转义字符:

    XML和HTML中都有一些特殊的字符,这些字符在XML和HTML中是不能直接使用的,如果必须使用这些字符,应该使用其对应的转义字符. XML常用转义字符: 字符 转义字符 描述 & & ...

  2. Codeforces Round #200 (Div. 1) B. Alternating Current 栈

    B. Alternating Current Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/343 ...

  3. [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)

    以杭电2544题目为例 最短路 Problem Description 在每年的校赛里,全部进入决赛的同学都会获得一件非常美丽的t-shirt. 可是每当我们的工作人员把上百件的衣服从商店运回到赛场的 ...

  4. 设计模式-工厂方法(Demo)

    工厂方法 工厂方法跟简单工厂一样.都是创建型的设计模式.他攻克了简单工厂的违背开放封闭的缺点. 故事 主人--人家做饭好累的.女仆抱着我大腿说着.自从上次把她买进家.没做了几次饭就喊累--看着她那出处 ...

  5. error: /usr/include/objc/objc-class.h: No such file or directory

    When i use the example of ShareKit package,i have come across this error:"error: /usr/include/o ...

  6. 观锁与悲观锁(Hibernate)

    乐观锁与悲观锁 文章转自网上好像是玉米田的,忘记了 锁( locking ) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个 cut-off 时间 ...

  7. 西门子PLC两线制,四线制

    1 一.对于控制系统模块:两线制,四线制信号都只有两根线接入模件,区别在于: 两线制信号的这两根线一正一负,不带提供信号电流,而且提供供电电压:一般流量,压力,液位等等的信号常用两线制信号,但也要根据 ...

  8. eclipse创建项目时出现appcompat_v7包及解决办法

    Android开发学习总结(三)--appcompat_v7项目说明 一.appcompat_v7项目说明 今天来说一下appcompat_v7项目的问题,使用eclipse创建Android项目时, ...

  9. 关于Git的工作区域和对应的文件状态.

    Git是一个免费的.分布式的版本控制工具,或是一个强调了速度快的源代码管理工具.每一个Git的工作目录都是一个完全独立的代码库,并拥有完整的历史记录和版本追踪能力,不依赖于网络和中心服务器. Git ...

  10. UVa 1645 Count(**)

    题目大意:输入n,统计有多少个n个结点的有根树,使得每个深度中所有结点的子结点数相同.结果模1000000007. 思路:根据题意,每个结点的每个子树都是相同的.所以n结果为n-1的所有约数的结果加起 ...