データ構造 - 循環キュー

シーケンシャルストレージ構造

いわゆるシーケンシャルストレージ構造は、連続したアドレスのセットを順次テールキューのヘッドに記憶手段から記憶されている要素。

ステートメント2つのポインタはrearfront次の位置とヘッド素子の尾部要素の位置を示すために使用されます。

初期化はrear = front = 0
、テールポインタの新しい要素を挿入する際は、ヘッド・オブ・キュー要素のポインタ、インクリメントされます。

しかし、そこにこれを行うには、チームはまだチーム、チームのヘッドやテールポインタを1つインクリメントされているかどうか、そうする問題は、問題があるあるチーム空いたスペースの要素を再利用することはできませんです

キューメモリ内の要素の実際の数が、ストレージスペースのサイズよりもはるかに小さいですが、チームはまだ操作を行います。この現象は呼ばれています偽オーバーフロー

循環キュー

円形キューです順次記憶構造の一の実施の待ち行列偽のオーバーフローの問題を克服するために、最後にキュー順序環状エンドによって想像されます。

画像

円形のキューが通過できない同一のヘッドとテールポインタキューの状態が空またはフルであるかどうかを決定するために、この場合には空であるか、月がいっぱいである可能性があるため

円形待ち行列空間の少なくとも一つの要素は、キューの決意フラグとして「テールポインタの次の位置にヘッド・ポインタは」完全スルーです。

コードの実装

#define MAXQSIZE 100 //队列最大长度
typedef struct{
    int *base;  //动态分配存储空间
    int front;  //头指针,若队列不空指向队首元素
    int rear;   //尾指针,指向队尾元素的下一位置
    int queueSize;    
} SqQueue;


bool initQueue(SqQueue &Q, int maxSize){
    Q.base = new int[maxSize];
    if(!Q.base){exit(-1);}
    Q.queueSize = maxSize;
    Q.front = Q.rear = 0;
    return true;
}

bool enQueue(SqQueue &Q, int e){
    if((Q.rear + 1) % Q.queueSize == Q.front){
        return false;
    }
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % Q.queueSize;
    return true;
}

bool deQueue(SqQueue &Q, int &e){
    if(Q.front == Q.rear){
        return false;
    }
    e = Q.base[Q.front];
    Q.front = (Q.front + 1) % Q.queueSize;
    return true;
}

注意を払います

  1. 場合rear = frontには、キューが空で判断することができます
  2. 場合は(rear + 1) % size == front、キューがいっぱいであることを決定することができます
  3. (rear - front + size) % sizeキューの長さ

おすすめ

転載: blog.csdn.net/hjc256/article/details/94165216