2012-11-23 1 views
0

내 교과 과정을 위해 대기열 구현을 작성하려고합니다.대기열에서 요소를 검색하는 것이 작동하지 않습니다. 검색 방법에 문제가 있습니까?

template<class GenericType> 
void QueueType<GenericType>::Enqueue(GenericType item) { 

    if (isFull()) { 

    } 
    else{ 
     rear = (rear + 1) % maxQue; 
     items[rear] = item; 
    } 
} 

과 : 여기

관련되는 부분이다 나는 또한 클래스가합니다 MyType 불렀다

template<class GenericType> 
void QueueType<GenericType>::Dequeue(GenericType &item){ 
    if(isEmpty()){ 

    }else{ 
     front = (front + 1) & maxQue; 
     item = items[front]; 
    } 
} 

이것은 단지 하나 개의 공공 유형 필드가 있습니다 INT 및 필드 이름 : 값.

그래서 :

int main(int argc, char** argv) { 

    MyType myOne; 
    myOne.value = 1; 

    MyType variable; 

    QueueType<MyType> myQ(); 

    myQ.Enqueue(myOne); 
    myQ.Dequeue(variable); 
    cout<<variable.value; 
} 

이 코드를 실행하면, 내가 얻을 값은 다음과 같습니다 : 0는하지만 1 할을 기대하고

class MyType{ 
    int value; 
} 

그리고 여기 내 주요 방법이다?

누구나 내가 놓친 내용을 설명해 주실 수 있습니까?

작은 편집 : 항목을 검색하기 전에 코드가 향상된다는 사실이 맞습니다. 정면은 -1로 초기화됩니다.

+2

나는 또한 당신이 일반적으로 검토하고 싶은 몇 가지 것을 볼 수있다. 첫째, 큐에서 모듈러 산술 연산을 수행한다면 충만 함을 검사하는 이유는 무엇입니까? 이 두 가지 전략은 상호 배타적 인 것처럼 보이며, 어떤 종류의 수집에 대해서도 모듈 식 산술은 물론 불투명 해 보이지 않습니다. 또한, 앞 계산에서 & 대신 %를 말하려고 했습니까? – RonaldBarzell

+0

고마워요.하지만 처음에는 앞쪽에 -1이 있기 때문에 그게 아니라고 생각합니다. 괜찮아. –

+0

@ user1161318 대기열이 가득 찬 경우 (생성자에 제한이 있기 때문에) 대기열에 아무 것도 추가하지 않아야하기 때문입니다. –

답변

1

코드에 표시된 오류가 front에서으로 중간에 있습니다.

그러나 문제의 직접적인 원인은 아닙니다. 문제는 당신이 보여주지 않은 코드에 있습니다. isFull()isEmpty()의 구현을 표시하지 않았습니다.

isEmpty()은 정확하지만 isFull()은 잘못된 것으로 간주하여 대기열이 가득차 있다고 간주합니다. 아무것도 추가되지 않으므로 대기열은 항상 비어있게됩니다. Dequeue() 함수는 공허함을 확인하는 것 외에는 아무 것도하지 않습니다. 큐가 항상 비어 있기 때문에 Dequeue()은 no-op입니다. isEmpty()이 잘못되었다고 가정하면, 큐가 비어 있다고해도 비어 있다고 간주합니다. 귀하의 Dequeue()은 다시 한번 아무 작업도하지 않을 것입니다.

if (isFull())if (isEmpty()) 문 중 일부는 then 부분으로 표시하는 것이 좋습니다.

코드에 다른 문제가 있습니다. 적어도 다음과 같습니다. 큐가 꽉 찼을 때 엔큐를 요청하거나 큐가 비었을 때 큐에서 큐를 제거하도록 요청하는 것과 같은 오류를 자동으로 무시하는 것은 좋지 않습니다. Dequeue()은 특히 문제가 있습니다. 대기열이 비어있을 때 무언가를해야합니다.

  • 큐가 비어 나타 내기 위해 예외를 던져, 또는
  • 아무 말없는 플래그가 대기열에서 제거 된 반환 또는
  • 는 아무것도 대기열에서 제거되지 않았 음을 나타 내기 위해 몇 가지 더미 (그러나 유효) 참조로 인수를 설정 또는
  • 함수가 인수를 수정하지 않고 포인터를 반환하거나 아무것도 표시하지 않고 null 포인터를 반환하도록합니다.
  • Boost::optional과 같이 고급 기능을 반환하도록합니다. 도움이하려고하는 모든 사람에게
0

는 :

대답은 의견입니다. 고맙습니다.

@ user1161318이 도움이되었습니다.

감사합니다.

대부분 여러분들은 잘못된 방향입니다. item 또는 isFull 구현을 검색하기 전에 전진하는 데는 아무런 문제가 없습니다. (몇 가지 해답이 있지만 지금 삭제됩니다.)

먼저 댓글을 확인하십시오.

도움 주셔서 감사합니다.

+0

모든 코드를 게시하면 혼동을 막을 수 있습니다. :-) 빈번한 오류는 예상 한 곳이 아니기 때문에 다음 번에 그렇게해야합니다. 처음에는 pass-by-reference가 어떻게 든 문제라고 생각했습니다. '% '때문에 링 버퍼 큐를 구현하는 것처럼 보였습니다. 이것은 매우 일반적인 구현입니다. 그리고 두 가지 조건을 구별 할 수 없기 때문에 충만 함이나 빈축에 대해 별도의 깃발이 필요합니다. – Omnifarious

+0

감사합니다. 나는 그것을 짧게하려고 노력했다. 그러나 내가 추측하는 좋은 생각이 아니었다. –

관련 문제