구조와 알고리즘의 배열 --2 서라운드 큐

서라운드 큐

대기열의 의미 :

큐가 구현되는 어레이 또는 링크 된리스트가 될 수있는 정렬 된 목록이며
선입 데이터에 저장되는 선입 선출 원리 먼저 제거하는 입금 후에 제거 큐 다음

아날로그 사고 큐의 배열
대기열 자체 정렬 된리스트를 저장 데이터 큐에 배열을 사용하여 구성되면,이 maxSize 큐의 최대 용량
출력 큐 이후 입력이 포함된다 기록 전후 큐 첨자 두 변수의 전방 및 후방 단부를 필요로 처리하는 후단으로부터 각각이며
앞의 출력 데이터로 변경되고, 후면은 데이터의 변경 입력
아날로그 순환 큐 어레이 아이디어
가변 큐 전면의 첫 번째 요소에 대한 포인터를 조정할 수 1front 의미, 즉 ARR [전면이 상기 큐의 첫 번째 요소이며, 앞의 초기 값 = 0 
조정 실제 마지막 포인트 대기열을 2rear 변수의 의미 요소들의 위치, 그것은 예약을하는 것이 바람직 빈 공간 때문에, 후방 초기 값 = 0 
3 큐, 단, 전체하다 [후방 + . 1 ] == % maxSize를 전면
4 큐가 빈 상태 인 경우 REAR == 전면
5 큐 [REAR 유효 데이터의 수 +를 maxSize를 앞]이 maxSize %

질문 1 : %의이 maxSize의 가치를 얻을 이유

 

 어레이는 어레이의 단부가 가득 환형 배열되지만 어레이 데이터 추출의 시작이므로, 다음 데이터 공간에 저장 될 수있다. 사용 %의 maxSize를 따라서

배열의 첫 번째 값, 후방 배열의 마지막 값은 앞 나타내고이고,이 때의 좌표의 환형 어레이는 시작 또는 끝에 속한다는 것을 의미하지 않는다

 

질문 2 : 후방 == 앞에 빈 큐 전체 큐 [후방 + 1]이 maxSize % == 앞에 다른 조건 :

 

 실제 == 전면에 따라 도시 된 바와 같이, 빈 또는 전체 두 가지 경우가 생길 수 있습니다. 우리는 공간의 요소를 유지하기 위해, 그 조건을 수정합니다. 큐가 가득 찼을 때 즉, 무료 셀 어레이가있다.

 아래와 같이, 우리는 우리는 그리기가 발생 허용하지 않는, 즉,이 큐가 가득 있다고 생각합니다.

 

 

com.ujiuye.queue 패키지;

수입 java.util.Scanner;

공용  클래스 CircleArrayQueue {
     공공  정적  무효 메인 (문자열 []에 args) {
        . 시스템 OUT의 .println ( " 시험 모델 케이스 큐 " );
         // 길이 (3)의 배열 만, 비어가, 그 두 데이터를 넣을 수있는 최대 
        CircleArray 큐 = 새로운 새 CircleArray을 ( 3 );
        스캐너 사우스 캐롤라이나 = 새로운 스캐너 (시스템. );
        문자 키 = '  ' ;
        부울 플래그 = 진정한 ;
        반면 (플래그) {
            . 시스템 OUT의 .println ( " S [쇼, 디스플레이 큐 " );
            . 시스템 OUT의 .println ( " E [종료] 삭제 큐 " );
            . 시스템 OUT .println ( " A [추가, 추가 큐 " );
            . 시스템 OUT의 .println는 ( " G는 [GET 같이, 데이터 큐를 취득한다 " );
            . 시스템 OUT .println ( " 열 헤더 데이터를 참조 H [헤드] " );
            체계. 밖으로 .println ( " ================== " );
            . 시스템 OUT .println는 ( " ! 이니셜 또는 영어)로 회신 해 주시기 바랍니다 (수행 할 수 있도록 작업을 입력하십시오 " ); . sc.next = () 수 charAt ( 0 );
            스위치 (키) {
             경우  ' 이야 ' :
                queue.showQueue ();
                휴식 ;
            경우  ' ' :
                . 시스템 OUT의 .println는 ( " 값 추가 " )
                 INT N- = ) (sc.nextInt 단계;
                queue.addQueue (N);
                휴식 ;
            케이스  ' g ' :
                 시도 {
                     INT 입술 = queue.getQueue ();
                    . 시스템 OUT .printf ( " 추출 된 값이 D % \ N- " , RES);
                } 캐치 (예외 전자) {
                    체계. 아웃 .println (e.getMessage ());
                }
                휴식 ;
            경우  ' 시간 ' :
                 시도 {
                     INT 고해상도 = queue.headQueue ();
                    . 시스템 OUT .printf ( " 큐의 헤드는 값이 D % \ N- " , RES);
                } 캐치 (예외 전자) {
                    체계. 아웃 .println (e.getMessage ());
                }
                휴식 ;
            경우  ' E ' :
                () sc.close;
                플래그 = 거짓 ;
                휴식 ;
            기본값 :
                 휴식 ;
            }
        }
        
    }
}
클래스 CircleArray는 {
     // 최대의 어레이의 용량을 나타내는 
    개인  INT 상기 maxSize를
     // 큐의 첫 번째 요소의 포인터 [앞], 언 큐, 초기 값 0의 첫번째 요소 인 
    개인  INT , 전면
     // 큐 포인트를 요소의 최종 위치가 그 약속 후방 = 0의 초기 값으로하는 것이 바람직 빈 공간 때문에 
    개인  INT 후방;
     // 데이터를 저장하는 아날로그 큐로 사용될 
    전용  INT [] ARR;
     공공 CircleArray ( int로 는 MAXSIZE) {
         이 본 = .maxSize maxSize를;
        도착 = 새로운  INT [maxSize를];
    }
    // 큐, 단, 전체 될 때 [REAR + 1이다.] == 전면 % maxSize를 
    공개 부울 isFull () {
          (REAR + 1이다. )이이 maxSize %의 == 전면;
    }
    // 큐가되면 빈 상태 == 전면 후면 
    공공 부울 IsEmpty 함수 () {
         반환 REAR == 전면;
    }
    //는 데이터 큐 추가 
    공개  공극 addQueue을 ( INT N-) {
         // 제 큐 풀인지를 결정 
        IF (isFull ()) {
            . 시스템 OUT의 .println는 ( " 큐는 줄을하시기 바랍니다 가득 " );
             반환 ;
        }
        //은 당신이 플러스로 직접 갈 수 있도록 의미하기 때문에 마지막 요소 후 후방 위치는 비어 있어야 하나. 
        ARR [후면] = N-;
         // , 후면, 고려 문제가 둘러싸고 이동합니다 그래서 사용 모듈 실시 
        REAR = (REAR + 1이다. ) % maxSize를;
    }
    // 큐의 데이터를 얻을 
    공공  INT {) getQueue을 (
         //은 먼저 큐가 있는지 여부를 확인 빈 
        IF (IsEmpty 함수 ()) {
             // 반환하지 예외 
            던져  새로운 새 (A의 RuntimeException의를 " 큐는, 값 빈입니다 " );
        }
        // 큐의 첫 번째 값을 얻을 
        INT의 값 = ; ARR [앞]
         // 전면이 값이 고려 주변 문제 복용 값을 얻기 위해 제 것을 보장하기 위해 다시 이동해야 이때 
        = 전면 (전면 + 1. ) % maxSize를,
         반환 값;
    }
    // 큐에있는 모든 값 
    공개  공극 showQueue () {
         // 제 큐인지를 결정 빈 
        IF (IsEmpty 함수 ()) {
             드로  새로운 새 에서의 RuntimeException ( " 큐가 비어 값 없음 " );
        }
        // 대하여 반복 값을 가로 지르는 제 앞에서 
         ( INT는 I = 전면 단계; I <크기 () + 전면; I ++ ) {
            체계. 아웃 .printf ( " 도착 [% d를] = % D \ n " , I % maxSize를, 도착 [I % maxSize를]);
        }
    }
    // 목록 데이터의 현재의 수를 결정하는 
    공공  INT의 크기 () {
         반환 합니다 (이 maxSize + 후면 - 전면) % 는 MAXSIZE;
    }
    // 데이터 큐 헤드 표시 
    공개  INT의 headQueue을 () {
         IF (IsEmpty 함수 ()) {
             드로  새로운 새 에서의 RuntimeException ( " 큐가 비어 값 없음 " );
        }
        반환 도착 [앞];
    }
}

 

..

추천

출처www.cnblogs.com/bai3535/p/12094059.html