0

次のコードを見てください

template <typename T>

class Stack
{
public:
    Stack(int number)
    {
        maxSize = number;
        top = -1;
        stackData = new T*(maxSize);
    }

    ~Stack()
    {
        delete [] stackData;
    }

    int count()
    {

    }

    bool isEmpty()
    {
        if(top==-1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    bool isFull()
    {
        if(top== (maxSize-1))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    *T pop()
    {
        if(!isEmpty())
        {
            return stackData[top--]; // Remove Item From Stack
        }
    }

    *T peek();

    void push(T *pushValue)
    {
        if(!isFull())
        {
            stackData[++top] = pushValue;
        }
    }

private:
    int maxSize;
    T ** stackData;
    int top;
};

上記のコードでは、コメント行に「Removing Item from the Stack」と書かれています。でも実際は外すのではなく、1つ後ろの価値を提供しているだけですよね?ここでは、スタックから特定の値を完全に削除することを削除と呼びます。

例: データ 1,2,3,4 を含む配列で、「2」を削除します。だから今は1,3,4です

第二に、「peek()」メソッド内で何が起こるべきでしょうか?

第三に、私が検出しなかったエラーはありますか?

助けてください!

4

5 に答える 5

2

スタックに配列を使用します。実際、topはスタックの一番上の要素を指します。したがって、これを行うと:

return stackData[top--]; 

トップが減少するため、スタックのサイズ減少します。あなたは本当に要素をポップします。

peekスタックの一番上にある現在の要素を返す必要があります-自分でそれを行う方法を理解してください。

于 2013-02-07T15:44:22.370 に答える
2

top概念的には、一番上の項目を減らすことと「削除する」ことに違いはありません。「削除」という言葉は、スタックの一番上のアイテムがスタックの要素ではなくなったという考えを説明するための概念的な抽象化です。メモリ内のその場所から文字通り削除されないという事実は関係ありません。

最上位のアイテムを「破棄」したい、つまり、そのデストラクタを呼び出して割り当てを解除しStackたい場合は、クラスがメモリを管理する方法のより大きな影響を考慮する必要があります。スタックが各Tオブジェクトの所有権を取得し、各Tオブジェクトが を使用して割り当てられている場合、デクリメントする前に関数を一番上のアイテムにnewすることができます。(ただし、削除された要素へのポインターを返すことはできません。) スタックが各アイテムの所有権を取得しない場合、要素有効期間/割り当て解除を管理するのは呼び出し元次第です。pop()deletetoppop()pop()

次に、peek()メソッドは、スタックから削除せずに、単純に一番上の項目へのポインターを返します。

T*最後に、ポインターの配列を正しく割り当てていません。構文は次のとおりです。

stackData = new T*[maxSize];

投稿したコードはnew、括弧の代わりに括弧を使用していますが、これはここで必要なものではありません。

于 2013-02-07T15:47:08.560 に答える
0

1)pop要素をポップしますが、何かがプッシュされるまで配列に残ります。しかしtop、スタックがそこにあることを「認識」しないように変更しました。が複合型の場合、デストラクタは で呼び出されませんpop

2)peek通常、ポップせずにスタックの一番上を表示します。

number3)コンストラクターへの引数を検証しません。

isFUll()また、単純に と書くこともできます{ return (top== (maxSize-1));}

于 2013-02-07T15:47:43.480 に答える
0

これが正しく引用されていると確信していますか:

stackData = new T*(maxSize);

そうではないはずです:

stackData = new T*[maxSize];

そうです、pop メソッドはデータを「破棄」するのではなく、スタックの一番上を次の位置 (一番上の要素から上から 2 番目の位置) に移動するだけです。なぜ「スタックから特定の値を破棄する」必要があるのか​​ わかりません...一般に、それは意味のある目的には役立ちません。

また、「途中で何かを削除する」と説明することは、スタックで通常行うことではありません-それはリスト、デキューなどです。

peek 関数の作成に関してはpoptop...

于 2013-02-07T15:47:52.630 に答える
0

topより大きなインデックスにあるすべての要素は無効であり、top よりも小さいインデックスにある要素はすべて有効であるという考え方です。top を減らすと要素が削除され、top を増やすと要素が追加されます。

于 2013-02-07T15:48:00.473 に答える