큐의 자바 데이터 구조

1. 장면

케이스의 은행 라인 :

2. 소개 큐

큐는 배열이나 달성하기 위해 링크 된 목록을 사용하여 정렬 된 목록입니다.

을 따르지 FIFO 원리를 :

  • 우선 먼저, 상기 데이터 큐에 저장된 제거.
  • 보증금은 후 제거 할 후

아날로그를 이용하여 어레이의 개략도 :( 큐)

3. 구현 1 : 아날로그 배열 큐

아이디어 분석

데이터 큐를 저장하는 구조의 배열로 선언한다면 자체가 정렬 된 목록 큐 큐 어레이의 최대 용량이 maxSize 큐이고, 다음과 같다.

  • 프리 큐 최전방 최 요소 앞에 전방 위치이다]
  • 함유 큐 후방의 마지막 요소는 [최종]
  • 전체 인큐 여부는 테일 포인터는 위로 이동 결정 후방 ++ 후 도착 [후방] 삽입
  • 포인터는 위로 이동하기 전에 큐에서 제거,이 공기의 여부를 판정한다 : 전면 ++ 후 제거 도착 [앞]
  • 분석 조건은 대기열이 비어 : 때 전방 == 후방 [빈]
  • 1] [큐가 가득 - 후면의 ==이 maxSize : 큐 전체 조건 여부를 결정

코드 구현

// 배열 시뮬레이션 큐 사용 - 기록 ArrayQueue 클래스 
클래스 ArrayQueue {
     개인  INT 는 MAXSIZE; //는 어레이의 최대 용량을 나타내는 
    개인  INT 전방 // 큐 헤드 
    전용  INT REAR 단계; // 큐의 끝 
    개인  INT [] ARR; // 데이터, 아날로그 큐를 저장하는 데이터 

    // 큐 생성자 생성 
    공개 ArrayQueue을 ( INT arrMaxSize) { 
        이 maxSize = arrMaxSize; 
        ARR = 새로운 새  INT [이 maxSize] 
        전면 = -1; //큐의 포인팅 헤드 큐 앞 헤드의 이전 위치로 분석 포인트 
        REAR = -1; // 큐의 끝을 가리키는 데이터 (즉, 대기열이 마지막 데이터 인)의 단부에 큐 포인트 
    } 

    // 큐 풀인지 
    공용  부울 isFull () {
         반환 REAR에게이 maxSize == - 1을. ; 
    } 

    // 큐가 비어 있는지 
    공공  부울 IsEmpty 함수 () {
         반환 후면 == 전면; 
    } 

    // 큐에 데이터를 추가 
    공공  무효 addQueue ( INT N-) {
         // 분석 대기열이 가득 차면 
        경우 (isFull는 ()) { 
            에서 System.out.println는 ( "큐가 가득 ~ 데이터가 추가 될 수 없음" );
            반환 ; 
        } 
        후방 ++; // 이동 후방시킨 후 
        ARR을 [후방 = N-; 
    } 

    // 데이터 큐, 큐 얻을 
    공중  INT {) getQueue을 (
         // 인지 빈 큐 
        IF (IsEmpty 함수 ()) {
             / / 예외를 던져 
            던져  새로운 새로운 말고 RuntimeException ( "큐는 데이터를받을 수 없어 비어" ); 
        } 
        전면 ++ // 전면 시프트 
        반환 ARR [전면]; 

    } 

    // 모든 데이터 큐를 보여 
    공공  무효 showQueue ({)
         / / 트래버스 
        경우(IsEmpty 함수는 ()) { 
            에서 System.out.println는 ( "큐가 비어있는, 데이터 ~ ~" );
             반환 ; 
        } 
        에 대한 ( int로하지 내가 ++; 나는 <arr.length I = 0 ) { 
            System.out.printf를 ( " ARR [D %의] D = % \ N- ' , I, ARR [I]); 
        } 
    } 

    // 데이터 큐의 헤드를 표시 한 관심이 추출되지 않은 데이터 
    공중  INT의 headQueue () {
         // 분석 
        IF (IsEmpty 함수 ()) {
             던져  새로운 새로운 말고 RuntimeException이 ( "큐가 비어있는, 데이터가없는 ~ ~" ); 
        } 
        반환 ARR [전면 + 1. ]; 
    } 
}
코드보기

문제

그것이 작동하지되면 현재 배열, 재사용 할 수 없습니다

최적화 모드 : 아날로그 순환 큐에 배열

4. 시뮬레이션 순환 큐 어레이

아이디어 :

도착 [전면이 상기 큐의 첫 번째 요소이며, 즉 전방 큐의 첫 번째 요소를 가리키는 : 1.front 변수를 의미하는 조정을하는

의미 2.rear 변수를 조정하게 : 큐의 마지막 요소 이후 요소에 후방 지점 빈 공간이 규칙으로 소망 때문에 (실제 용량 큐 = maxSize를-1 어레이 벗어난 지역 점을 방지하기 위해 제공되는 것으로 이해) .

큐가, 단 전체 3이다 : (. REAR + 1)이 maxSize %의 전면 == [전체] 

4. 대기열은, 단, 비어있는 경우 : REAR == 전면 [빈]

큐의 유효 데이터의 수 : (+ REAR이 maxSize - 전면)에이 maxSize %의

6. 인큐는 후방 도착 [후방] 대기열하는 전체 팀을 결정 ++

제 큐 빈 판정 팀 제 아웃 큐 도착 [앞]에서 제거되면, 그 다음 전방 ++

코드 구현

클래스 CircleArray {
     개인  INT 상기 maxSize를가 // 어레이의 최대 용량을 나타내는
     // 변수 조정을 전면 의미 앞 포인트 큐의 첫 번째 요소, 즉 도착 [앞] 큐의 첫 번째 요소이다 
     // 전면 = 0의 초기 값 
    전용  INT 전면; 
     // 있도록 후방 조절 변수의 의미 위치로 후방 가리키는 큐의 마지막 요소 이후에 빈 공간이 규칙으로 소망 때문에 ..
     // 후방 초기 값 = 0 
    개인  INT REAR; // 큐의 끝 
    개인  INT [] ARR; // 이 데이터는, 데이터를 저장하는 아날로그 대기열에 사용되는 
    
    공용 CircleArray을 ( INT arrMaxSize) { 
        이 maxSize = arrMaxSize; 
        ARR= 뉴 새로운  INT [이 maxSize] 
    } 
    
    // 대기열이 가득 차 있는지 
    공개  부울 isFull () {
          (REAR + 1이다.)이이 maxSize %의 == 전면; 
    } 
    
    //이 큐가 비어 있는지 여부를 판단 
    공개  부울 IsEmpty 함수 () {
         복귀 REAR == 전면; 
    } 
    
    // 큐에 데이터를 추가 
    공공  무효 addQueue ( INT N-) {
         // 큐가 가득 여부를 결정 
        만약에 (isFull ()) { 
            에서 System.out.println이 ( "큐가 가득, 데이터를 추가 할 수 없습니다 ~" );
             반환 ; 
        }
        // 데이터를 직접 첨가 
        ARR [REAR = N -
         // REAR 이동 한 후에이 고려되어야 모듈 
        REAR = (REAR + 1). % 이 maxSize; 
    } 
    
    // 데이터 큐를 얻기 큐 
    공중  INT getQueue () {
         // 여부를 빈 큐 
        만약에 (IsEmpty 함수 ()) {
             // 던져 예외 
            던져  새로운 새로운 말고 RuntimeException ( "큐는 데이터를받을 수 없어 비어" ); 
        } 
        // 전면에 큐 포인트에서 첫 번째 요소에서 넣어 할 필요가
         // 1. 제 앞에 임시 변수에 대응하는 값을 유지
         // 전방 시프트 후의 2. 고려 모듈
         // 3 임시 저장된 변수 리턴 
        INT의 값 = ARR [앞];
        전면 = (전면 + 1). % maxSize를,
         반환 값; 

    } 
    
    // 모든 데이터 큐 보여줄 
    공개  공극 () {showQueue를
         // 반복하지 
        IF (IsEmpty 함수 ()) { 
            에서 System.out.println ( "큐가 비어 데이터를 ~ ~ " );
             반환 ; 
        } 
        // 아이디어 : 전면에서 통과가, 요소의 수는 횡단
         // 두뇌 
        에 대한을 ( int 형 = 전면 I를, 나는 전면 + 크기 (<); 내가 ++ ) { 
            System.out.printf를 ( " ARR [D %의] D = % \ N- "은이 maxSize I % ARR [I % 이 maxSize]); 
        } 
    } 
    
    //유효한 데이터의 현재 큐 번호 얻기 
    공중  INT의 크기 () {
         // REAR = 2
         // . 전면 1 =
         // .는 MAXSIZE 3 = 
        복귀 합니다 (maxSize를 REAR + - 전면) % 이 maxSize;    
    } 
    
    // 디스플레이 데이터 대기열 헤드, 데이터가 촬영되지 않습니다 
    공공  INT의 ) headQueue을 ({
         // 분석 
        IF (IsEmpty 함수 ()) {
             던져  새로운 새로운 말고 RuntimeException ( "큐가 비어있는, 데이터가없는 ~ ~" ); 
        } 
        반환 ARR [전면]; 
    } 
}
코드보기

 

추천

출처www.cnblogs.com/MWCloud/p/11239320.html