データ構造を学習 - 説明キューの配列を

キューの友達〜(私はとても幸せだよ、なぜ神は知っている)を始めるために、
作業を始める前に、まず第一に、古いルールは、抽象クラスキュー与えられたが

template<class T>
class queue
{
public:
    virtual ~queue(){}
    virtual bool empty()const=0;//返回true,当且仅当队列为空
    virtual int size()const=0;//返回队列中元素个数
    virtual T& front()=0;//返回头元素的引用
    virtual T& back()=0;//返回尾元素的引用
    virtual void pop()=0;//删除首元素
    virtual void push(const T& theElement)=0;//把元素theElement加入队尾
};

キューを記述するアレイは、キューが満杯であるかどうか判断に焦点を当てて、アレイを介してループを書き込むことができます。
キューを散りばめた場合、キューが空と判断、このような状況を回避するために、キューはこの方法をちりばめすることができないようなキュー満杯状態であり、キュー要素の最大数にarrayLength-1です。フルタイムであることがキューを使用する必要があるかどうかを決定する際に:
IF((+ theback 1)==前部にarrayLength%)
にarrayLengthキュー配列の長さである
thebackアレイの尾の位置のヘッドの位置の前に前部アレイである
特定の外観図は、下
ここに画像を挿入説明
これを理解し、ルックキュー配列の説明しました:

class arrayQueue:public queue<T>
{
private:
    int theFront;//队首
    int theBack;//队尾
    int arrayLength;//数组长度
    T *queue;
public:
    arrayQueue(int initialCapacity=10)//构造函数
    {
        theBack=0;
        theFront=0;
        arrayLength=initialCapacity;
        queue=new T[arrayLength];
    }
    bool empty()const
    {
        if(theBack==theFront)
            return true;
        return false;
    }
    int size()const
    {
        return (theBack-theFront+arrayLength)%arrayLength;
    }
    T& front()
    {
        if(theBack==theFront)
            //抛出异常,队列为空
        int tmp=(theFront+1)%arrayLength;
        return queue[tmp];
    }
    T& back()
    {
        if(theBack==theFront)
            //抛出异常,队列为空
        return queue[theBack];
    }
    void pop()
    {
        if(theBack==theFront)
            //抛出异常,队列为空
        theFront=(theFront+1)%arrayLength;//更新theFront的值
        queue[theFront].~T();  //在数组上调用一个Template模板的析构函数
    }
    void push(const T& theElement);
};
void arrayQueue<T>::push(const T& theElement)
{
    if((theBack + 1) % arrayLength == theFront)//如果队列将要满
        //增加数组长度
    theBack=(theBack+1)%arrayLength;
    queue[theBack]=theElement;
}
公開された32元の記事 ウォン称賛12 ビュー1365

おすすめ

転載: blog.csdn.net/qq_18873031/article/details/103399752