데이터 구조 학습 기록 (6) - 순서 순환 대기 열

대기 열 에 가짜 넘 침 현상 이 나타 날 수 있 기 때문에 개선 조 치 는 순환 대기 열 을 사용 하 는 것 입 니 다.
순환 대기 열 은 논리 적 으로 전체 선형 표 의 앞 뒤 를 연결 시 켜 '링' (실제 물리 구 조 는 1 차원 배열) 을 형성 하 는 것 이다.
즉, rear 와 front 포인터 가 MaxSize 에 도 착 했 을 때 다시 초기 위치 로 0 (합 법 적 이 어야 합 니 다. 예 를 들 어 팀 이 꽉 찼 을 때 rear + 1 을 초기 위치 로 돌아 갈 수 없습니다).
이 조작 은 모드 (나머지) 연산 을 사용 하여 rear 와 front 의 값 을 변화 시 킨 후 대기 열 길이 의 MaxSize 를 모드 로 추출 해 야 합 니 다.
논리 적 으로 배열 의 머리 와 꼬리 를 연결 하기 때문에 팀 이 꽉 차 면 팀 이 비어 있 는 판단 조건 은 모두 rear = front 이 고 팀 이 비어 있 고 팀 이 꽉 차 면 보통 세 가지 조작 이 있다.
  • 남 은 저장 단위 가 데 이 터 를 저장 하지 않 고 표시 위치 로 사용 하면 대기 만 표지 가 (rear + 1)% MaxSize = = front
  • 로 변 합 니 다.
  • 대기 열 에 현재 대기 열의 요소 개 수 를 기록 하 는 변 수 를 설정 합 니 다. MaxSize 와 같 으 면 가득 차고 0 이면 비어 있 습 니 다.
  • 대기 열 에 bool 형식 변수 표지 팀 만 화 팀 공
  • 을 설치 합 니 다.
    대학원 시험 문제 에 서 는 일반적으로 첫 번 째 방식 을 사용한다.
    코드 는 일반 대기 열 에 비해 차이 가 크 지 않 습 니 다. 다음 과 같 습 니 다.
    #ifndef CIRCLE_H
    #define CIRCLE_H
    
    #define MaxSize 50;
    typedef int Elemtype;
    
    typedef struct SqCircularQueue{
    Elemtype elem[MaxSize];
    int front,rear;
    }SqQueue;
    
    //      
    void InitSqQueue(SqQueue &Q)
    {
        Q.front=Q.rear=0;
    }
    
    //  
    bool SqQueueEmpty(SqQueue Q)
    {
        if(Q.front==Q.rear)
            return true;
        else
            return false;
    }
    
    //  
    bool SqQuereFill(SqQueue Q)
    {
        if((Q.rear+1)%MaxSize==Q.front)
            return true;
        else
            return false;
    }
    
    
    //  
    bool EnSqQueue(SqQueue &Q,Elemtype x)
    {
        if(SqQuereFill(Q))
            return false;
        else
        {
            Q.elem[Q.rear]=x;
            Q.rear=(Q.rear+1)%MaxSize;
            return true;
        }
    }
    
    //  
    bool DeSqQueue(SqQueue &Q,Elemtype &x)
    {
        if(QueueEmpty(Q))
            return false;
        else
        {
            x=Q.elem[Q.front];
            Q.front=(Q.front+1)%MaxSize;
            return true;
        }
    }
    
    //   
    bool GetSqQueueHead(SqQueue Q,Elemtype &x)
    {
        if(QueueEmpty(Q))
            return false;
        else
        {
            x=Q.elem[Q.front];
            return true;
        }
    }
    
    
    #endif
    
    

    참고 로 선택 문 제 를 제시 하 겠 습 니 다. 대기 열 에 있 는 요소 의 개 수 는 (rear - front + MaxSize)% MaxSize 입 니 다.
    그리고 대기 열 이 비어 있 는 것 과 가득 찬 표 지 는 각각 무엇 입 니까? 그리고 대기 열 이 대열 에 들 어가 서 나 오 는 조작 이 두 개의 지침 에 대한 변화 등 도 있 습 니 다.

    좋은 웹페이지 즐겨찾기