米国(7)オーダーキューストレージ構造とチェーンストレージ構造のデータ構造

ディレクトリ

キュー

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

ストレージ構造キュー

エンキュー操作

デキュー


キュー

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

キュー、名前が、それは我々が通常ラインアップ構造の一種で、あなたと以下のJVその定義を詳しく見であることを示唆しているよう。

待ち行列(キュー)をのみに許可された挿入操作(尾部)端部が、削除操作(HOL)の他端リニア形。それはFIFO(先入れ先出し)、同じアップだけライン。

削除操作はO(n)が行うのはなぜですか?チームのヘッド削除後の可動要素が存在しますので。その後、我々はビットを最適化するための方法を考えると、削除操作を簡単にさせることができます。

私たちは、と言っ削除操作の端が最初のチームと呼ばれる、された、とき要素の削除操作それほど移動しない、我々は待ち行列の先頭と末尾に二つのポインタポイントを導入することができますので、0の場所については、必ずしも次のキューの頭の中では必要ありませんしかし、時間複雑度はO(N)からO(1)となるように、ポインタを移動させます。

チームの頭と尾にフロントとリア、それぞれのポイント:OK、今は二つのポインタを持っています。

だから、どのように我々はこのキューが空で判断しないことがいっぱいですか!いくつかは、それは限りチームのヘッド、テールリアポインティング、フロントポイントするので、非常に単純であることを言うだろう、フロント=リア、キューが詠唱を充填しました。あなたはあまりにも素朴な友人だ学生は、下の図を見てみましょう。

あなたはどちらの空の完全なチームは、その後、最終的にどのように完全な決定またはそれのキューを空フロント=リアことが、チームを満たしていない、参照してください?

実際には、2つの方法があります。

1、我々はこれらの2つの場合で、全体があり、完全に空にすることを除いて、その前は=リアであることがわかります。その後、我々はそうでない場合は、全体がいっぱいになった、フラッグタグ、フラグが空の場合、フロントは=リア、我々は場所の旗を判断し、全体のキューが空に立って、参照するには、目に最も喜ばせるのキューにある場所を見つけることができます。

2、フルリア=空のフロントを決定することができなくなっ判定条件を変更し、我々は再定義することはできません:フロント=リア、空気の力を、空間の要素が空である、完全なチームがあるとき。

それは〜このサブサブドロップで

レッツ話はリア-1 = 1 +リアまたはフロント=直接フロントを定義するのではなく、なぜ議論しますか?支出へのポインタなので、我々は確かに希望は、キューは、可能な限り、アレイのためのスペースをより効率的に使用することがあること、リアはフロントのか、前後に表示されることがありますが、コンピュータを伝えるときに我々が定義したときに、そう、あいまいなことはできませんスペースの要素は空、完全なチームがあります。

このアイデアはどのようにコンピュータにそれを伝えるには?最大寸法あるQUEUESIZEキューを提供し、その後キュー満杯状態が(1 +リア)%QueueSizeに==フロントなければならない、キュー長は次のように計算される:(リアフロント+ QueueSizeに)ので、空の%QueueSizeに(、それはあなたがそれを実践し、キューの先頭することができます)この式は、実際のキューの長さを使用して計算される、と言うことですカウント長さ、することはできません。

[OK]を、我々はそれのためのコードを書き始めることができます

typedef int QElemType;

typedef struct
{
    QElemType data[MAXSIZE];
    int front;
    int rear;
}SqQueue;


//初始化一个空队列
Status InitQueue(SqQueue *Q)
{
    Q->front=0;
    Q->rear=0;
    return OK;
}

//返回队列的元素个数,即当前长度
int QueueLength(SqQueue Q)
{
    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}

//入队操作
Status EnQueue(SqQueue *Q,QElemType e)
{
    if((Q->rear+1)%MAXSIZE==Q->front)
        return ERROR;        //判断队列是否满了
    Q->data[Q->rear]=e;        //赋值
    Q->rear=(Q->rear+1)%MAXSIZE; //指向下一个
    return OK;
}

//出队操作,用e返回其值
Status DeQueue(SqQueue *Q,QElemType *e)
{
     if((Q->rear+1)%MAXSIZE==Q->front)
        return ERROR;        //判断队列是否满了
    *e=Q->data[Q->front];//将队头元素赋值给e
    Q->front=(Q->front+1)%MAXSIZE    //front指针向后移动一位
                                     //若到最后则转到数组头部
    return OK;
}

ストレージ構造キュー

ストレージ構造キュー、実際には、一本鎖の線状の形が、唯一頭の唯一の吸気終了。

キューが空で、フロントとリアのヘッドノード点がある場合。

typedef int QElemType;

typedef struct QNode  //结点结构
{
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct 
{
    QueuePtr front,rear; //队头队尾指针
}LinkQueue;

エンキュー操作

Status EnQueue(LinkQueue *Q,QElemType e)
{
    QueuePtr s=(QueuePtr)malloc(sizeof(QNode))
    if(!s)
        exit(OVERFLOW);
    s->data=e;
    s->next=NULL;
    Q->rear->next=s;
    Q->rear=s;
    return OK;
}

デキュー

//删除队头,并用e返回其值
Status DeQueue(LinkQueue *Q,QElemType *e)
{
    QueuePtr p;
    if(Q->front==Q->rear)   //判断是否为空
        return ERROR;

    p=Q->front->next;       
    *e=p->data;
    Q->front->next=p->next;

    if(Q->rear==p)
        Q->rear=Q->front;
    free(p);

    return OK;
}

 

公開された38元の記事 ウォンの賞賛6 ビュー1906

おすすめ

転載: blog.csdn.net/weixin_43827227/article/details/100903422