미국 (칠) 주문 큐 저장소 구조 및 체인 저장 구조의 데이터 구조

디렉토리

순차 저장 큐 구조

저장 구조 큐

인큐 작업

디큐


순차 저장 큐 구조

큐 이름은 우리가 일반적으로 정렬 구조의 종류, 당신과 함께 다음과 같은 합작의 정의에 대한 자세한 모습이다 제안한다.

큐 (큐)가 만에 허용되는 삽입 동작 (꼬리) 단부 반면 삭제 조작 (HOL)의 타단 형태 선형. 선입 선출 (FIFO) 그냥 같은 줄 (선입).

삭제 작업이 O (n은) 할 이유는 무엇입니까? 팀 헤드 삭제 후 이동 요소가 될 것입니다 때문입니다. 그런 다음 우리는 삭제 작업을 간단하게 약간 최적화 할 수있는 방법을 생각할 수 있습니다.

우리는 말할 삭제 작업의 끝이 첫 번째 팀으로 언급되는 때 요소 삭제 작업 때문에 이동하지 않습니다,하지만 우리는 두 개의 포인터는 큐의 머리와 꼬리를 가리 소개 할 수 있도록 반드시 공의 위치는 다음 큐 헤드에 필요하지 그러나 시간 복잡도가 O (N)로부터 O (1)가되도록하는 것이, 포인터를 이동한다.

각각 전면과 후면, 팀 머리와 꼬리를 가리킨 : OK, 이제 우리는 두 개의 포인터가있다.

그래서, 그것의 전체 우리가 어떻게 판단합니까 큐가 하늘인가? 일부는만큼 같은 팀 머리, 꼬리에 후방 포인팅, 프론트 점 때문에 매우 간단하다는 말을 앞 = 후면 , 큐가 노래로 가득했다. 당신이 너무 순진한 친구 야 학생들은, 아래 그림에서보세요.

당신은 둘 다 빈의 전체 팀이 다음 결국 어떻게 전체 결정하거나 그것의 큐를 비우 전면 = 그 뒤,하지만 팀을 만족하지 않는, 보이지?

사실, 두 가지 방법이 있습니다 :

1, 우리는 전체가,이 두 건으로 완전히 비울 것을 제외하고 전면, 후면 = 것을는 사실을 알게 될 것입니다. 그런 다음 우리는 그렇지 않으면 전체가 가득, 플래그가 비어있는 경우가 깃발 태그 전면 후면 = 때, 우리는 장소의 깃발을 판단, 전체 큐가 비어에 서 볼 수있는 눈에 가장 만족스러운의 큐에있는 장소를 찾을 수 있습니다 .

2, 빈 전면 전체 후면 = 결정할 수 있습니다 더 이상 판정 조건을 수정, 우리는 다시 정의 할 수 없습니다 : 전면 후면, 공군 =, 공간의 요소가 비어, 전체 팀이다있을 때.

그것은 ~이 하위 서브 드롭입니다

바로 앞을 정의하기보다는 왜,하자의 이야기가 논의 = 1 + 후면 또는 전면 후면 1 않습니다 =? 포인터 지출하기 때문에, 우리는 확실히, 후면의 앞이나 앞 뒤 나타날 수 큐가 가능한 배열을위한 공간을보다 효율적으로 사용할 수있다 희망하지만, 컴퓨터를 말할 때, 우리는 정의 그렇게 할 때, 모호 할 수 없습니다 공간의 요소는 빈, 전체 팀이 있습니다.

이 아이디어는 어떻게 컴퓨터를 말할? 제공자 최대 치수 QUEUESIZE 큐가 다음 큐의 전체 상태가되어야한다 (+ 후방 1) % QUEUESIZE == 앞에 큐 길이는 다음과 같이 계산된다 : 때문에 비어들 ((후방 전면 + QUEUESIZE) % QUEUESIZE, 이 공식은 연습, 대기열의 전방 가능) 실제 대기열 길이를 계산하고, 즉, 길이가 계산 될 수 없다.

좋아, 우리는 그것을 위해 코드를 작성을 시작할 수 있습니다

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