2014-10-25 1 views
1

책을 읽을 때 문제없이 전체 코드를 이해했지만 방법의 특정 조건을 이해하지 못합니다.순환 대기열에서 카운트없이 접근하는 isEmpty()/

배경 : 목표는 항목 변수를 사용하지 않고 "배열"을 사용하여 항목을 추적하는 대신 크기 n을 n + 1로 설정하고 앞면과 뒷면에 의존하여 값을 얻는 것입니다 .

public boolean isEmpty() // true if queue is empty { 
    return (rear+1==front || (front+maxSize-1==rear)); 
} 

나는 return 문에서 두 번째 조건을 추적하는 데 최선을 다했으나 얻을 수 없다. (앞면 + 최대 크기 -1 = 뒷면)

누군가 도움을 줄 수 있습니까?

+0

앞과 뒤가 무엇입니까? 저는 그들이 정수라고 가정하고 있습니다. –

+0

maxSize의 값은 무엇입니까? – AdamMc331

+0

Maxsize = 사용자가 의도 한 대기열의 크기 +1. – Lifter

답변

1

내부 array 크기는 maxSize입니다.
큐가 하나의 요소를 보유하고 있고 frontrear이 모두 배열의 마지막 슬롯을 가리킬 때를 상상해보십시오. 즉, 당신이 팝업되면

front == rear == maxSize - 1; 

()이 마지막 요소, 당신의 front는 인덱스 0, 그리고 큐 "원형"움직임은 비어가되어야합니다.

하지만 rear은 pop()에서 이동하지 않으므로 여전히 maxSize - 1이됩니다.

front+maxSize-1==rear 어획량 정확히 (front이 경우에보다 작은 rear을하기 때문에 첫 번째 조건과 일치하지 않는)이 특정 상황

편집 한 당신이 수에 조건을 모두 결합하는 후자의 조건 쓰기 :

// true if rear is one "step" behind front 
public boolean isEmpty() { 
    return (rear + 1) % maxSize == front; // based on suggestion of @eckes 
} 

희망이 있습니다.

+1

((후면 + 1) % maxSize == 프론트) – eckes

+1

옙스, 조금 나아졌습니다. 원하는 경우 언제든지 답변을 수정할 수 있습니다. – kiruwka

+0

이 책에서는 뒤쪽이 최대 크기 -1에 도달하면 인덱스 0으로 돌아갑니다. (또는 -1이면 삽입 작업에서 array [++ index]를 사용하지만 Front는 0으로 재설정됩니다. 그것은 maxsize에 도달합니다. 왜냐하면 이것들은 결코 그 조건에 도달하지 않을 것이기 때문입니다. – Lifter

관련 문제