• 队列


    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];
    }
  • 相关阅读:
    request和request.form和request.querystring的区别
    设计模式—单例模式
    设计模式--单例模式之Lock
    一般处理程序
    C#使用wkhtmltopdf.exe,HTML页面转化为PDF文档
    iTextSharp 使用详解(转)
    简单工厂模式
    单例模式防反射及性能(二)
    java单例模式
    java学习笔记之基础语法(二)
  • 原文地址:https://www.cnblogs.com/zhouqianwei/p/9069733.html
Copyright © 2020-2023  润新知