2017-10-27 2 views
1

C++で循環配列を使用してキュー実装を作成しようとしています。私はその部分を正しく持っていますが、私の割り当てでは、main.cppの関数でQueueを表示するように求めています。これは私がwhileループでそれを印刷しなければならなくて、キューのサイズがコンパイル時に最大サイズであるとは限らないので、私には問題があります。C++構造体の配列をnullに初期化し、後でこの配列の要素がwhileループでnullであるかどうかを確認できますか?

たとえば、ユーザーが最大サイズ3のキューに2人の乗客をエンキューし、そのキューに乗客を印刷する場合は、2回の繰り返しだけwhileループを実行する必要があります。しかし、私はキューのサイズを渡すことはできませんので、私はこれを行うことができる唯一の方法は、乗客の構造体が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.cpp

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 
} 

の私のクラスのコンストラクタであり、これは私が私のmain.cppにでやろうとしているものです。 Queue要素を順番に印刷しようとしていますが、ユーザーが入力した要素だけを印刷します。言い換えれば、私は空の要素を印刷したくありません。

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

私は???の代わりに何を置くべきかは不明です。私はさまざまな方法を試しましたが、構造体の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

私は答えを更新しました。クラスを変更できない場合は、フロントメンバーとリアメンバーを使用して乗客の数を把握し、それに応じてEnqueue、Dequeue、IsEmpty、IsFullを実装することになっていると思います。 – mnistic

+0

ありがとう!私はCQueueクラスで正しく実装されたメソッドを持っていましたが、whileループ条件でIsEmpty()を使用することはありませんでした。出来た! –

関連する問題