队列

原创作者:Daniel

时间:2017.10.29

地点:大连理工大学软件学院

FIFO(first in first out)

队列不改变进入队列元素的顺序,即队列可以存储元素的顺序。

队列存储结构:

1、顺序队列:分配一段连续的区域存储队列的元素,需要预先制定队列大小。

为了充分使用队列空间,一般会将队列在逻辑上看成一个圆,队满条件为 (rear + 1)% M == front,队空条件为 rear = front,队列中元素个数为(rear - front + M)% M;

实现顺序队列的C++代码:

template <typename  T>
class queue{
private:
    int size;
    T* qqueue;
    int front;
    int rear;
public:
    queue(int size){
        this->size = size;
        qqueue = new T [size];
        front = rear = 0;
    }

    ~queue(){
        if(qqueue)
            delete [] qqueue;
    }

    bool enqueue(T & a){
        if((rear + 1) % size == front){
            return false;
        }
        qqueue[rear] = a;
        rear = (rear + 1) % this->size;
        return true;
    }

    bool dequeue(){
        if(rear == front ){
            return false;
        }
        front = (front + 1 )% this->size;
        return false;
    }
    
    T first(){
        if(rear == front){
            return -1;
        }
        
        return qqueue[front];
    }
    
    int get_size(){
        
        return ((rear - front + this->size));
    }
    
};

2、链式存储

设置一个队头指针front,队尾指针rear,通过front进行删除,通过rear进行元素入队。

不过要注意的是队列为空时的进队情况,以及对列为空时的出队情况。

实现链式队列的C++代码:

template <typename T>
class queue{
private:
    int cursize;
    Node<T>* front;
    Node<T>* rear;
public:
    queue(){
        front = rear = NULL;
        cursize = 0;
    }
    ~queue(){
        Node<T>* temp;
        while(front){
            temp = front->next;
            delete front;
            front = temp;
        }
    }
    bool enqueue(T & a){
        Node<T>* p(a, NULL);
        if(rear == NULL){
            front = p;
            rear = p;
            cursize++;
        }
        p->next = rear;
        rear = p;
        cursize ++;
        return true;
    }
    
    bool dequeue(){
        if(front == NULL){
            rear = NULL;
            return false;
        }
        Node<T>* p = front ->next;
        delete front;
        cursize --;
        front = p;
        return true;
    }
    
    T first(){
        if(front == NULL){
            return -1;
        }
        return front->item;
    }
    
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值