C小加

厚德 博学 求真 至善 The bright moon and breeze
posts - 145, comments - 195, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

基本数据结构:队列(queue)

Posted on 2012-08-02 15:00 C小加 阅读(13410) 评论(1)  编辑 收藏 引用 所属分类: 数据结构和算法

基本数据结构:队列(queue)

作者:C小加 更新时间:2012-8-2

像栈一样,队列(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也给出了一个强大的队列,我们直接可以去用它。

队列相关问题

如何用两个栈模拟一个队列,如果用两个队列模拟一个栈?

Feedback

# re: 基本数据结构:队列(queue)  回复  更多评论   

2013-05-26 23:55 by 一心一路
总觉得后面的应用举例太少了

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理