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 [전면]; } }