队列(链式存储)C++模板实现
#include <iostream>
using namespace std; //队列结点类
template <typename T>
class QueueNode{
private:
T data; //结点数值部分
QueueNode<T> * next; //指向下一结点
public:
QueueNode(T d=0 , QueueNode<T> *n=NULL){ //构造函数
data= d;
next=n;
};
void setData(T d){ //设置数值部分
data = d;
}
void setNext(QueueNode<T> * n){ //设置next
next = n;
}
T getData() const { //返回数值部分
return data;
}
QueueNode<T> * getNext() const{ //返回next
return next;
}
}; //队列类
template <typename T>
class Queue{
private:
int num; //队列结点个数
QueueNode<T> *front,*rear; //front队首指针(出队的一端),rear队尾指针(入队的一端)。
public:
Queue(){ //队列类构造函数
num=0;
front=NULL;
rear=NULL;
}
~Queue(){ //释放整个队列空间即释放整个链表
while(front){
QueueNode<T> * p = front;
front = front->getNext();
delete p;
}
}
void In(T x); //一个值为x的结点进队
void Out(); //队首结点出队
T getFront() const; //获得队首结点的值
bool isEmpty() const; //判断队列是否为空
int getLength() const; //获得队列长度
void printAll() const; //打印整个队列
}; //一个值为x的结点进队,实现部分
template <typename T>
void Queue<T>::In(T x){
if(isEmpty())
front=rear=new QueueNode<T>(x);
else {
QueueNode<T> *p= new QueueNode<T>(x);
rear->setNext(p);
rear = p;
}
num++;
} //队首结点出队,实现部分
template <typename T>
void Queue<T>::Out(){
QueueNode<T> *p=front;
front = front->getNext();
delete p;
num--;
} //获得队首结点的值,实现部分
template <typename T>
T Queue<T>::getFront() const {
return front->getData();
} //判断队列是否为空,实现部分
template <typename T>
bool Queue<T>::isEmpty() const {
return num==0;
} //获得队列长度,实现部分
template <typename T>
int Queue<T>::getLength() const {
return num;
} //打印整个队列,实现部分
template <typename T>
void Queue<T>::printAll() const{
if(isEmpty())
cout<<"队列为空"<<endl;
else{
QueueNode<T> *p =front;
int i =1;
while(p){
cout<<"第"<<i<<"个结点:"<<p->getData()<<endl;
p = p->getNext();
i++;
}
}
}
void main(){
Queue<int> a; //创建队列
cout<<"队列初始长度:"<<a.getLength()<<endl<<endl;
a.In(1); //值为1的结点进队
a.In(2); //值为2的结点进队
a.In(3); //值为3的结点进队
a.In(4); //值为4的结点进队
a.In(5); //值为5的结点进队
cout<<"队列长度:"<<a.getLength()<<endl;
a.printAll(); //打印队列
a.Out(); //队首结点出队
a.Out(); //队首结点出队
cout<<endl<<"队列长度:"<<a.getLength()<<endl;
a.printAll(); //打印队列
}
队列(链式存储)C++模板实现的更多相关文章
- 队列链式存储 - 设计与实现 - API函数
队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数 队列也是一种特殊的线性表:可以用线性表链式存储来模拟队列的链式存储. 主要代码: // linkqueue.h // 队列链式 ...
- C++编程练习(6)----“实现简单的队列的链式存储结构“
队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出.简称链队列. 实现代码如下: /* LinkQueue.h 头文件 */ #include<iostream> #defi ...
- 队列(FIFO)—循环队列、队列的链式存储
1 队列的定义 队列是只允许在一端(队尾)进行插入操作,而在另一端(队头)进行删除操作的线性表. 2 队列的特点 1)先进先出是队列最大的特点,是应用中非常常见的模型,例如排队: 2)队列也属于线性表 ...
- 队列的顺序存储与链式存储c语言实现
一. 队列 1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表. 2.循环队列:把存储队列的顺序队列在逻辑上视为一个环. 循环队列状态: 初始时:Q.front=Q.rear=0 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)
优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...
- Java实现链式存储的二叉查找树(递归方法)
二叉查找树的定义: 二叉查找树或者是一颗空树,或者是一颗具有以下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均小于根节点的关键字: 2. 若右子树非空,则右子树上所有节点关键字值 ...
- Java实现链式存储的二叉树
二叉树的定义: 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 二叉树的遍历方式主要 ...
- C#数据结构-二叉树-链式存储结构
对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
- 栈的链式存储 - API实现
基本概念 其它概念详情參看前一篇博文:栈的顺序存储 - 设计与实现 - API实现 这里也是运用了链表的链式存储API高速实现了栈的API. 代码: // linkstack.h // 链式存储栈的A ...
随机推荐
- virtualbox 创建com对象失败
其实这个错误是因为VirtualBox不兼容Win7引起的,只要把VirtualBox的兼容模式改为出Win7以外的就行了.. 右键VirtualBox的桌面快捷方式,选择属性,选到兼容性选项卡,勾选 ...
- 【23】宁以non-member、non-friend替换member函数
1.non-member方法与member方法没有本质区别,对于编译器来说,都是non-member方法,因为member方法绑定的对象,会被编译器转化为non-member方法的第一个形参.non- ...
- SQLSERVER复制表的方法
1.复制表结构及数据 格式:select * into 新表名 from 要复制的表名 --例如:select * into temp from users 2.只复制表数据 格式 ...
- python爬虫之採集——360联想词W2版本号
http://blog.csdn.net/recsysml/article/details/30541197,我的这个博文介绍了对应的简单的方法做一个联想词的爬虫,并且还承诺了下面优化: 下一版本号的 ...
- sphinx配置文件继承
# # Minimal Sphinx configuration sample (clean, simple, functional) # source mysql { type = mysql #数 ...
- 将centos 7改造为LINUX桌面系统
http://www.3566t.com/news/ckan/1410774.html CentOS 桌面版安装配置(以CentOS 7为例) http://blog.csdn.net/zhanghu ...
- SSRS集成至Web
分几步进行,第一步要实现:IReportServerCredentials 接口第二步:拖入ReportViewer控件第三步:进行报表传参控制.具体如下图描述....代码部分参考下附件 using ...
- MySQL flush privileges 명령어
INSERT나 UPDATE, DELETE문을 이용해서 MySQL의 사용자를 추가,삭제하거나, 사용자 권한 등을 변경하였을 때, MySQL에 변경사항을 적용하기 위해서 사용하는 명령 ...
- List的add方法与addAll方法的区别
add是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素addAll是传入一个List,将此List中的所有元素加入到当前List中,也就是当 ...
- 对象创建型模式------Builder(生成器或建造者模式)(2)
链接转自:http://blog.csdn.net/wuzhekai1985/article/details/6667467 主要思想是:首先有个指挥家思想者将大体的设计思路设计出来,然后寻找一部分工 ...