데이터 구조 입문 - 대기 열

3052 단어
'선진 선 출' 을 실현 할 수 있 는 저장 구조
분류:
  • 체인 대기 열: 체인 테이블 로 실현
  • 정적 대기 열: 배열 로 이 루어 집 니 다. 정적 대기 열 은 보통 순환 대기 열
  • 이 어야 합 니 다.
    순환 대기 열의 설명:
  • 정적 대기 열 은 왜 순환 대기 열 로 메모리 낭 비 를 줄 입 니까
  • 순환 대기 열 은 두 개의 매개 변 수 를 확인 하기 위해 몇 개의 매개 변 수 를 필요 로 합 니 다. frant, rear 그러나 이 두 개의 매개 변 수 는 서로 다른 상황 에서 서로 다른 의 미 를 가지 기 때문에 초보 자 들 이 먼저 기억 하 는 것 을 권장 합 니 다
  • 순환 대기 열 각 매개 변수의 의미 대기 열 초기 화: front 와 rear 의 값 은 모두 0 대기 열 이 비어 있 지 않 습 니 다. front 는 대기 열의 첫 번 째 요 소 를 대표 합 니 다. rear 는 대기 열의 마지막 유효 요소 의 다음 요소 대기 열 이 비어 있 습 니 다. front 와 rear 의 값 은 같 지만 0
  • 이 아 닙 니 다.
  • 순환 대기 열 입 대 위 알고리즘 은 rear 가 대표 하 는 위치 에 값 을 저장 하 는 잘못된 쓰기: r = r + 1 정확 한 것 은 r = (r + 1)% 배열 길이
  • 순환 팀 이 팀 의 위조 알고리즘 front = (front + 1)% 배열 길이
  • 순환 대기 열 이 비어 있 는 지 여 부 를 어떻게 판단 합 니까? front 와 rear 의 값 이 같 으 면 대기 열 이 비어 있 습 니 다
  • 순환 대기 열 이 가득 차 서 표 표 지 를 하나 더 추가 하 는 매개 변 수 를 어떻게 판단 하 는 지 요 소 를 적 게 사용 합 니 다. 보통 다음 과 같 습 니 다. (rear + 1)% 배열 길이 = front
  • 구체 적 실현
    #include 
    #include 
    #include 
    
    
    typedef struct Queue
    {
        int * pBase;
        int front;
        int rear;
    }QUEUE;
    
    void init(QUEUE *);
    bool full_queue(QUEUE *);
    bool empty(QUEUE *);
    bool en_queue(QUEUE * , int val); //   
    void traverse(QUEUE *);
    bool out(QUEUE *, int * pVal);
    
    
    int main(void)
    {
        QUEUE Q;
        int val;
    
        init(&Q);
        en_queue(&Q , 1);
        en_queue(&Q , 2);
        en_queue(&Q , 3);
        en_queue(&Q , 4);
        en_queue(&Q , 5);
        en_queue(&Q , 6);
        en_queue(&Q , 7);
    
        traverse(&Q);
        if (out(&Q , &val))
        {
            printf("    ,     :%d
    ", val); en_queue(&Q , 9); traverse(&Q); } else { printf("
    "); } return 0; } void init(QUEUE * pQ) { pQ->pBase = (int *)malloc(sizeof(int) * 6); // 6 if (NULL == pQ->pBase) { printf("
    "); exit(-1); } pQ->front = 0; pQ->rear = 0; } bool full_queue(QUEUE *pQ) { if ((pQ->rear+1)%6 == pQ->front) { return true; } else { return false; } } bool en_queue(QUEUE *pQ , int val) { if (full_queue(pQ)) { return false; } else { pQ->pBase[pQ->rear] = val; pQ->rear = (pQ->rear+1)%6; return true; } } void traverse(QUEUE * pQ) { int i = pQ->front; while(i != pQ->rear) { printf("%d
    ",pQ->pBase[i] ); i = (i+1) % 6; } return; } bool empty(QUEUE * pQ) { if (pQ->front == pQ->rear) { return true; } else { return false; } } bool out(QUEUE * pQ, int * pVal) { if (empty(pQ)) { return false; } else { *pVal = pQ->pBase[pQ->front]; pQ->front = (pQ->front+1) % 6; return true; } }

    대기 열의 응용
  • 시간 과 관련 된 모든 조작 에는 대열 의 그림자 가 있다
  • 좋은 웹페이지 즐겨찾기