zoukankan      html  css  js  c++  java
  • 队列

    1.队列实现的是一种先进进先出的策略,即被删除的是最先插入的元素(也称为FIFO,即先进先出)

    2.基本成员函数:

    back()返回最后一个元素

    empty()如果队列空则返回真

    front()返回第一个元素

    pop()删除第一个元素

    push()在末尾加入一个元素

    size()返回队列中元素的个数

    3.队列的实现

    include<cassert>
    #include<iostream>
    using namespace std;
    template<typename T>
    class Queue
    {
    public:
        Queue(int maxsize = 10);
        Queue(const Queue<T>& rhs);
        Queue<T>& operator=(const Queue<T>& rhs);
        ~Queue();
    public:
        bool empty() const;
        bool IsFull() const;
        int size() const;
    
        void push(const T& data);
        void pop();
        T& front();
        T   front() const;
        T& back();
        T   back() const;
    private:
        T *array;
        int Front;//头部   当Front=rear时表示队列已满,当Front+1=rear时,表示队列已满
        int rear;//尾部
        int capacity;
    };
    
    template<typename T>
    Queue<T>::Queue(int maxsize) :Front(0), rear(0),capacity(maxsize)
    {
        array = new T[maxsize];
        assert(array != NULL);    //存储分配失败则退出;
    }
    
    template<typename T>
    Queue<T>::Queue(const Queue<T>& rhs) :Front(rhs.Front), rear(rhs.rear),capacity(rhs.capacity)
    {
        array = new T[capacity];
        for (int i = 0; i != (this->size()); i++)
            array[i] = rhs.array[i];
    }
    
    template<typename T>
    Queue<T>& Queue<T>::operator=(const Queue<T>& rhs)
    {
        if (this != &rhs)
        {
            delete[] array;
            capacity = rhs.capacity;
            Front = rhs.Front;
            rear = rhs.rear;
            array = new T[capacity];
            for (int i = 0; i != (this->size()); i++)
                array[i] = rhs.array[i];
        }
        return *this;
    }
    template<typename T>
    Queue<T>::~Queue()
    {
            delete[] array;
    }
    
    template<typename T>
    bool Queue<T>::empty() const
    {
        return Front == rear;      //此处为循环队列,当front==rear时为空。
    }
    
    template<typename T>
    bool Queue<T>::IsFull() const
    {
        return(rear + 1) % capacity == Front;   //当(rear+1)%capacity==front为满,因为为满时差一个元素,但是可能rear>front,也可能rear<front.
    }
    
    template<typename T>
    int Queue<T>::size() const
    {
        return (rear - Front + capacity) % capacity;
    }
    
    template<typename T>
    void Queue<T>::push(const T& data)
    {
        if (!IsFull())
        {
            array[rear] = data;
            rear = (rear + 1) % capacity;//这里是循环队列的实现
        }
        else                                                  //当队列满了之后可进行扩容
        {
            T *newarray=new T[ 2*capacity ];
            for (int i = 0; i != 2*capacity&&!this->empty(); i++)
            {
                newarray[i] =this-> front();
                this->pop();//将之前的队列全部复制过来
            }
            delete [ ] array;//再将之前的队列释放
            array = newarray;//将指针指向新的空间,从而达到扩容的效果
            Front = 0;
            array[rear] = data;
            rear =this->rear+1;
            capacity = 2*capacity;
        }
    }
    
    template<typename T>
    void Queue<T>::pop()
    {
        if (!empty())
        {
            //array[Front].~T();   //将队头元素析构掉
            Front = (Front + 1) % capacity;
        }
        else
            cout<<"empty queue!"<<endl;
    }
    
    template<typename T>
    T& Queue<T>::front()
    {
        if (empty())
            cerr << "Error, queue is empty!";
        return array[Front];
    }
    template<typename T>
    T Queue<T>::front() const
    {
        if (empty())
            cerr << "Error, queue is empty!";
        return array[Front];
    }
    template<typename T>
    T& Queue<T>::back()
    {
        if (empty())
            cerr << "Error, queue is empty!";
        return array[rear-1];                             //rear类似与尾后指针
    }
    template<typename T>
    T Queue<T>::back() const
    {
        if (empty())
            cerr << "Error, queue is empty!";
        return array[rear-1];
    }
  • 相关阅读:
    HDU 2844 Coins(多重背包)
    HDU 4540 威威猫系列故事——打地鼠(DP)
    Codeforces Round #236 (Div. 2)
    FZU 2140 Forever 0.5
    HDU 1171 Big Event in HDU(DP)
    HDU 1160 FatMouse's Speed(DP)
    ZOJ 3490 String Successor
    ZOJ 3609 Modular Inverse
    ZOJ 3603 Draw Something Cheat
    ZOJ 3705 Applications
  • 原文地址:https://www.cnblogs.com/zhouqianwei/p/9069733.html
Copyright © 2011-2022 走看看