队列(顺序存储)C++模板实现
队列:一端进行插入,另一端进行删除的线性结构,具有先进先出性。利用数组来实现队列将面临“假溢出”的情况,如下图所示:
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++模板实现的更多相关文章
- [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)
循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...
- 队列顺序存储 - 设计与实现 - API函数
队列是一种特殊的线性表 队列仅在线性表的两端进行操作 队头(Front):取出数据元素的一端 队尾(Rear):插入数据元素的一端 队列不允许在中间部位进行操作! queue常用操作 销毁队列 清空队 ...
- 基于数组的循环队列(C++模板实现)
循环队列使用数组实现的话,简单.方便.之前实现的队列,当尾端索引到达队列最后的时候,无论前面是否还有空间,都不能再添加数据了.循环队列使得队列的存储单元可以循环利用,它需要一个额外的存储单元来判断队列 ...
- C 队列顺序存储
#ifndef __MY_SEQLIST_H__ #define __MY_SEQLIST_H__ typedef void SeqList; typedef void SeqListNode; // ...
- SPOJ - ADALIST,双端队列入门模板!
ADALIST - Ada and List 这道题时限6.5s,激动人心啊,好多人STL一顿乱写AC,哈哈,如果熟悉双端队列的话这道题其实是很水的. 题意:n个数的数列,然后接下来Q次操作,每次可以 ...
- C++标准库类模板(stack)和 队列(queue)
在C++标准库(STL)中有栈和队列的类模板,因此可以直接使用 1.栈(stack):使用栈之前,要先包含头文件 : #include<stack> stack.push(elem); / ...
- 基于python实现顺序存储的队列代码
""" 队列-顺序存储 seqqueue.py 代码实现 """ # 自定义异常类 class QueueError(Exception): ...
- (转)java redis使用之利用jedis实现redis消息队列
应用场景 最近在公司做项目,需要对聊天内容进行存储,考虑到数据库查询的IO连接数高.连接频繁的因素,决定利用缓存做. 从网上了解到redis可以对所有的内容进行二进制的存储,而java是可以对所有对象 ...
- C++ 并发消息队列
C++ 并发消息队列 在网上找到了一份POSIX线程显示的并发消息队列示例代码: http://codereview.stackexchange.com/questions/41604/thread- ...
随机推荐
- Ubuntu 安装 Courier New字体
apt-get install ttf-mscorefonts-installer 它的本质是安装 Courier New字体 安装的时候会出现一个协议 按TAB键 ,可以选中<确定>按 ...
- PHP PDO函数库具体解释
文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/565 PDO是一个"数据库訪问抽象层",作用是统一各种数据库的訪问接口 ...
- [Bootstrap] 6. Navigation
Too Much Navigation? How many of Bootstrap's Navigation Components can we use on a page? 0 1 More th ...
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
[目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...
- RHEL 7特性说明(七):编译程序及工具
转载自:RedHat https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/7/html/7.0_Release ...
- debian配置简单的vsftp服务器
Ubuntu Linux与Windows系统不同,Ubuntu Linux不会产生无用垃圾文件,但是在升级缓存中,Ubuntu Linux不会自动删除这些文件,今天就来说说这些垃圾文件清理方法. 1 ...
- mysql控制流程函数
1.case语句 select case 2 when 1 then '男' when 2 then '女' else 'xoap' end as result; 2.if语句 select if(1 ...
- iOS的崩溃和编译错误
1. Command /bin/sh failed with exit code 127 这是因为mogenerator找不到路径,stackoverflow给出的答案是: If /usr/local ...
- innodb对update的处理
当更新非聚集索引上记录 和 聚集索引上的主键时,是标记删除,然后插入新的记录 当更新聚集索引上的非主键列时,是updated-in-place,也就是说原地修改,不会插入新记录. 之前一直以为都是以标 ...
- 【转】Android应用程序的数据存放目录解说
Android的每个应用程序,都有自己的可控的目录. 在Setting/Application info里面,可以看到每个应用程序,都有Clear data和Clear cache选项. 具体这些目录 ...