美文网首页
用数组实现队列

用数组实现队列

作者: HardMan | 来源:发表于2021-09-07 17:44 被阅读0次
    #include <malloc.h>
    template <class T>
    class ArrayQueue{
    private:
        int head=0;
        int tail=0;
        int size=0;
        T* array=NULL;
    
    
    public:
        ArrayQueue();
        ArrayQueue(int size);
    
        void push(T t);
    
        T pop();
    
        T peek();
    
        bool isEmpty();
    
        ~ArrayQueue();
    
        void growArray();
    };
    
    template<class T>
    ArrayQueue<T>::ArrayQueue() {
        //默认size=8,只要是2的幂次方都可以 这里设为8
        this->size=8;
        array=(T*)malloc(sizeof(T)*size);
    }
    
    template<class T>
    ArrayQueue<T>::ArrayQueue(int init_size) {
        this->size=8;
        if(init_size>8){
            this->size=init_size;
            this->size|=this->size>>2;
            this->size|=this->size>>4;
            this->size|=this->size>>8;
            this->size|=this->size>>16;
    
            this->size+=1;
    
        }
    
        array=(T*)malloc(sizeof(T)*size);
    
    
    }
    
    template<class T>
    void ArrayQueue<T>::push(T t) {
        head=(head-1)&(size-1);
        array[head]=t;
        if(head==tail){
            growArray();
        }
    }
    
    template<class T>
    T ArrayQueue<T>::pop() {
        tail=(tail-1)&(size-1);
        return array[tail];
    }
    
    template<class T>
    T ArrayQueue<T>::peek() {
        return array[(tail-1)&(size-1)];
    }
    
    template<class T>
    bool ArrayQueue<T>::isEmpty() {
        return tail==head;
    }
    
    template<class T>
    ArrayQueue<T>::~ArrayQueue() {
        if(array){
            free(array);
            array=NULL;
        }
    
    
    
    }
    
    template<class T>
    void ArrayQueue<T>::growArray() {
        int new_size=size<<1;
    
        T* new_array=(T*)malloc(sizeof(T)*new_size);
    
        int count=size-head;
    
        for(int i=0;i<count;i++){
    
            new_array[0+i]=array[head+i];
        }
    
        for(int i=0;i<head;i++){
    
            new_array[count+i]=array[0+i];
        }
    
        free(array);
        this->array=new_array;
    
        this->head=0;
        this->tail=size;
        this->size=new_size;
    }
    
    
    
    

    整体思路:


    数组的队列.png

    注意点
    队列的size必须要设置成2的幂次方,是为了在push和pop的时候,head和tail的下标始终能够在size-1到0之间进行循环。
    比如size=8,(head-1)&(size-1)的情况有如下几种
    head=0; -1&7=7;
    head=7;6&7=6;
    head=6;5&7=5;
    head=5;4&7=4;
    head=4;3&7=3;
    head=3;2&7=2;
    head=2;1&7=1;
    head=1; 0&7=0;

    0???(小于7,二进制的表示)

    0 1 1 1(7的二进制表示)
    所以两者进行&运算 结果都为0 ? ??

    相关文章

      网友评论

          本文标题:用数组实现队列

          本文链接:https://www.haomeiwen.com/subject/izjpwltx.html