서라운드 큐
대기열의 의미 :
큐가 구현되는 어레이 또는 링크 된리스트가 될 수있는 정렬 된 목록이며
선입 데이터에 저장되는 선입 선출 원리 먼저 제거하는 입금 후에 제거 큐 다음
아날로그 사고 큐의 배열
대기열 자체 정렬 된리스트를 저장 데이터 큐에 배열을 사용하여 구성되면,이 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 ( " 큐가 비어 값 없음 " ); } 반환 도착 [앞]; } }
..