2017-10-27 2 views
1

C++에서 순환 배열을 사용하여 큐 구현을 작성하려고합니다. 나는 그 부분을 얻었지만, 나의 할당은 main.cpp에있는 함수에서 Queue를 출력하도록 요구한다. while 루프에서 인쇄해야하고 큐의 크기가 컴파일 타임에 반드시 최대 크기가 아니기 때문에 이것은 문제가됩니다.C++ 구조체 배열을 null로 초기화하고 나중에이 배열의 요소가 while 루프에서 null인지 확인하는 방법은 무엇입니까?

예 : 사용자가 최대 크기가 3 인 대기열에 2 명의 승객을 대기열에두고 대기열에 승객을 인쇄하려는 경우 while 회 돌이를 2 회만 계속하도록해야합니다. 그러나 나는 큐의 크기를 전달할 수 없으므로이 작업을 수행 할 수있는 유일한 방법은 큐의 승객 구조가 NULL이 아닌지 확인하는 것입니다. 구조체 컨텍스트 내에서 NULL이 무엇을 의미하는지 알지 못합니다.

이것은 내 헤더 파일 CQueue.h입니다.

const int MAX = 3; 

struct Passenger { 
    char name[80]; 
}; 

class CQueue { 
private: 
    int front; 
    int rear; 
    Passenger passengers[MAX]; 

public: 
    CQueue(); 
    bool IsEmpty(); 
    bool IsFull(); 
    void Enqueue(Passenger); 
    Passenger Front(); // Returns the passenger type at the front index of array 
    void Dequeue(); 
}; 

CQueue::CQueue() // Custom constructor initializes the fields of the CQueue class with the appropriate values 
{ 
    front = -1; // Conditions for emptiness of CQueue 
    rear = -1; // Conditions for emptiness of CQueue 
    ??? // needs a line to initialize passengers[MAX] elements to some default NULL value 
} 

CQueue.cpp

내 클래스 생성자입니다 그리고 이것은 내 MAIN.CPP에서 할 노력하고있어 것입니다. Queue 요소를 순서대로 인쇄하려고하지만 사용자가 입력 한 요소 만 인쇄하려고합니다. 즉, 빈 요소를 인쇄하고 싶지 않습니다.

while (???) // check if passanger is not the default null value 
    { 
     cout << CQueue.Front() << "\n"; 
     copyQueue.Dequeue(); 
    } 

???의 위치에 무엇을 넣어야할지 불확실합니다. 나는 여러가지 다른 방법을 시도했지만 struct에 대한 NULL 값이 무엇인지 알지 못한다는 단순한 사실로 귀결됩니다.

미리 감사드립니다.

+0

문제는 무엇인가? 주제에 질문을 넣어 다른 사람들이 귀하를 도울 수 있는지 빨리 확인하고 귀하가하려는 것을 이해하는 것이 더 쉽습니다. – Jacob

답변

0

승객 배열은 포인터 배열이 아닌 개체 배열이므로 "NULL"승객을 가질 수 없습니다. 그러나 포인터로 변경하는 대신 CQueue에서 승객 수를 계산하여 승객이 "기본값"인지 확인하는 것이 훨씬 더 깔끔한 설계입니다. 다음

bool CQueue::IsEmpty() { return rear != -1 && front != -1; } 
bool CQueue::IsFull() { return rear - front >= MAX; } 

그리고 : 같은 뭔가

CQueue::CQueue() // Custom constructor initializes the fields of the CQueue class with the appropriate values 
{ 
    front = -1; // Conditions for emptiness of CQueue 
    rear = -1; // Conditions for emptiness of CQueue 
} 

그리고 :

while (!copyQueue.IsEmpty()) 
{ 
    cout << CQueue.Front() << "\n"; 
    copyQueue.Dequeue(); 
} 
+0

좋은 아이디어! 하지만 과제의 제약으로 인해 제한됩니다. 나는 CQueue 클래스를 변경할 수 없다. 포인터 방법에 대해 자세히 설명해 주시겠습니까? –

+0

답변을 업데이트했습니다. 클래스를 변경할 수 없다면 전후방 멤버를 사용하여 승객 수를 파악하고 적절하게 대기열에서 대기열에서 대기열에 넣기, 대기열에서 대기열에서 대기열에 넣기, 대기열에서 대기열에서 대기열로 보내기, 대기열에서 대기열에서 대기열로 보내기 및 대기열에서 대기열로 보내기를 수행해야합니다. – mnistic

+0

감사합니다. CQueue 클래스에서 올바르게 구현 된 메서드가 있지만 while 루프 조건에서 IsEmpty()를 사용하지 않았습니다. 그것은 효과가있다! –

관련 문제