基本数据结构:队列(queue)
2013-08-04 11:29
295 查看
像栈一样,队列(queue)也是一种线性表,它的特性是先进先出,插入在一端,删除在另一端。就像排队一样,刚来的人入队(push)要排在队尾(rear),每次出队(pop)的都是队首(front)的人。如图1,描述了一个队列模型。
和栈一样,队列也有数组实现和链表实现两种,两种实现都能给出快速的O(1)运行时间,区别在于链表实现指针域要占用空间,频繁的new和delete会消耗不少的时间开销,数组实现唯一的缺点是建立时要确定空间大小。
假如一个队列最多只能站10个人,当占满10个人后,第11个人就不能入队,这种情况成为溢出。而如果第一个人出队了,剩下的9个人依然还在原来的位置,队列里空出了一个位置,但第11个人还是不能入队,这种情况成为假溢出。克服假溢出有效的办法是使用循环队列。
循环队列就是把队尾和队首连接起来,形成一个环,队尾的下一个位置就是队首,这样可以有效的防止假溢出现象,但队列的实际容量已然固定。
队列的实现
队列的数组实现和栈差不多,不同的是,栈用top做下标,队列用front和rear作为下标。
我更改了单链表的模板来实现一个简单的队列。代码仅供学习,不足之处还请指明,我会对不足之处进行修改和更新。
代码如下:
template<class T>
class queueNode
{
public:
queueNode():next(NULL){}
T data;//值
queueNode* next;//指向下一个节点的指针
};
template<class T>
class myqueue
{
private:
unsigned int queuelength;
queueNode<T>* node;//临时节点
queueNode<T>* rear;//队尾
queueNode<T>* front;//队首
public:
myqueue();//初始化
unsigned int length();//队列元素的个数
void push(T x);//入队
bool isEmpty();//判断队列是否为空
void pop();//出队
T getHead();//获得队首元素
};
template<class T>
myqueue<T>::myqueue()
{
node=NULL;
rear=NULL;
front=NULL;
queuelength=0;
}
template<class T>
inline unsigned int myqueue<T>::length(){return queuelength;}
template<class T>
void myqueue<T>::push(T x)
{
node=new queueNode<T>();//申请一个新的节点
node->data=x;//新节点赋值为x
if(rear==NULL)//如果没有尾节点则队列为空,node既为队首,又是队尾
{
front=node;
rear=node;
}
else//如果队列非空
{
rear->next=node;//node既为尾节点的下一个节点
rear=node;//node变成了尾节点,把尾节点赋值为node
}
++queuelength;//元素个数+1
}
template<class T>
bool myqueue<T>::isEmpty()
{
return queuelength==0;
}
template<class T>
void myqueue<T>::pop()
{
if(queuelength==0) return;
node=front;
front=front->next;
delete(node);
--queuelength;
}
template<class T>
T myqueue<T>::getHead()
{
return front->data;
}
队列的应用
打印机处理作业采用的就是队列结构,它们会按照提交的顺序排列起来。STL也给出了一个强大的队列,我们直接可以去用它。
队列相关问题
如何用两个栈模拟一个队列,如果用两个队列模拟一个栈?
原文链接:http://www.cppblog.com/cxiaojia/archive/2012/08/02/186033.html
和栈一样,队列也有数组实现和链表实现两种,两种实现都能给出快速的O(1)运行时间,区别在于链表实现指针域要占用空间,频繁的new和delete会消耗不少的时间开销,数组实现唯一的缺点是建立时要确定空间大小。
假如一个队列最多只能站10个人,当占满10个人后,第11个人就不能入队,这种情况成为溢出。而如果第一个人出队了,剩下的9个人依然还在原来的位置,队列里空出了一个位置,但第11个人还是不能入队,这种情况成为假溢出。克服假溢出有效的办法是使用循环队列。
循环队列就是把队尾和队首连接起来,形成一个环,队尾的下一个位置就是队首,这样可以有效的防止假溢出现象,但队列的实际容量已然固定。
队列的实现
队列的数组实现和栈差不多,不同的是,栈用top做下标,队列用front和rear作为下标。
我更改了单链表的模板来实现一个简单的队列。代码仅供学习,不足之处还请指明,我会对不足之处进行修改和更新。
代码如下:
template<class T>
class queueNode
{
public:
queueNode():next(NULL){}
T data;//值
queueNode* next;//指向下一个节点的指针
};
template<class T>
class myqueue
{
private:
unsigned int queuelength;
queueNode<T>* node;//临时节点
queueNode<T>* rear;//队尾
queueNode<T>* front;//队首
public:
myqueue();//初始化
unsigned int length();//队列元素的个数
void push(T x);//入队
bool isEmpty();//判断队列是否为空
void pop();//出队
T getHead();//获得队首元素
};
template<class T>
myqueue<T>::myqueue()
{
node=NULL;
rear=NULL;
front=NULL;
queuelength=0;
}
template<class T>
inline unsigned int myqueue<T>::length(){return queuelength;}
template<class T>
void myqueue<T>::push(T x)
{
node=new queueNode<T>();//申请一个新的节点
node->data=x;//新节点赋值为x
if(rear==NULL)//如果没有尾节点则队列为空,node既为队首,又是队尾
{
front=node;
rear=node;
}
else//如果队列非空
{
rear->next=node;//node既为尾节点的下一个节点
rear=node;//node变成了尾节点,把尾节点赋值为node
}
++queuelength;//元素个数+1
}
template<class T>
bool myqueue<T>::isEmpty()
{
return queuelength==0;
}
template<class T>
void myqueue<T>::pop()
{
if(queuelength==0) return;
node=front;
front=front->next;
delete(node);
--queuelength;
}
template<class T>
T myqueue<T>::getHead()
{
return front->data;
}
队列的应用
打印机处理作业采用的就是队列结构,它们会按照提交的顺序排列起来。STL也给出了一个强大的队列,我们直接可以去用它。
队列相关问题
如何用两个栈模拟一个队列,如果用两个队列模拟一个栈?
原文链接:http://www.cppblog.com/cxiaojia/archive/2012/08/02/186033.html
相关文章推荐
- 【C++研发面试笔记】16. 基本数据结构-队列queue与栈stack
- 基本数据结构:队列(queue)
- [笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列
- 用Python实现基本数据结构——栈与队列
- 【数据结构】第2周 栈与队列 2:栈的基本操作
- 算法导论第十章 基本数据结构实现(栈,队列,链表),课后题答案
- ngx源码分析--数据结构 队列ngx_queue_t
- 【数据结构】 栈和队列 YTU 2248: 栈的基本运算(栈和队列)
- 数据结构学习之队列(queue)
- [C++数据结构]队列Queue
- 《算法导论》第十章——基本数据结构(一):栈与队列
- 数据结构类型定义及基本操作汇总(一)--线性表,单链表,栈和队列
- 数据结构 链队列基本操作
- 【学习笔记10】基本数据结构(栈 队列 链表 有根树)
- Python实现基本数据结构---队列操作
- 数据结构-链队列的基本操作
- 数据结构:实验四栈和队列的基本操作实现及其应用
- java数据结构——6队列(Queue)
- [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)
- c++基本数据结构的类的用法--栈,队列,链表