0

私はこのウェブサイトに不慣れで、私が求めるのと同じくらい貢献しようとします. また、私は自分で解決しようと多くの時間を費やすことなく質問することは決してないことを知っておいてください.

そのため、C++ スタックは私を夢中にさせています。

私の質問: 実際に使用するには、変数/値を Stack 関数ブロックのどこに配置すればよいですか。スタックがLIFOデータ構造であることを理解しています。プレートを積み重ねる例を無数に読んだことがあります。

このコードを見てください:

#include <iostream>
using namespace std;

const int MAX_SIZE = 100;

class StackOverFlowException 
{
    public:
        StackOverFlowException() 
        {
            cout << "Stack overflow" << endl;
        }
};

class StackUnderFlowException 
{
    public:
        StackUnderFlowException() 
        {
            cout << "Stack underflow" << endl;
        }
};

class ArrayStack 
{    
    private:        
        int data[MAX_SIZE];        
        int top;    
  public:        
      ArrayStack() 
      {            
          top = -1;        
    }        

    void Push(int element)
    {            
        if ( top >= MAX_SIZE ) 
            {            
                throw new StackOverFlowException();
            }                   
            data[++top] = element;        
    }        

    int Pop()
    {            
        if ( top == -1 ) 
            {            
                throw new StackUnderFlowException();            
            }            
            return data[top--];        
    }        

    int Top() 
    {            
        return data[top];        
    }

    int Size() 
    {
        return top + 1;
    }

    bool isEmpty() 
    {
        return ( top == -1 ) ? true : false;
    }
};

[等....]

それは基本的なクッキーカッターです....最後に出された食べ物の注文が最初に追い出されるシステムを表現するためにそれを適応させようとしているとしましょう。変数は「食べ物」、「注文」などです。世界のどこで、これらの変数を上記のスタック コードに統合しているのですか!?!??!

助けてください混乱して無差別に何かを殴りそうです

4

6 に答える 6

4

スタックの実装ではテンプレートを使用できるため、スタックに必要なものを (理にかなった範囲内で) 配置できます。

たとえば、注文に関連するすべてのデータをカプセル化するクラスがあります (これは単なる例です)。

class FoodOrder
{
    int orderNumber;
    time_t orderTime;

    // add more variables here
}

次に、スタックは次のようになります。

template<typename T> class Stack
{
    T data[MAX_SIZE];
    int top;

    void Push(T item);
    T Pop(void);

    // add methods
}

次に、必要Stackなアイテムをすべて持つことができます。

Stack<int> stackOfInts;
Stack<std::string> stackOfStrings;
Stack<FoodOrder> stackOfOrders;
于 2012-04-29T23:18:10.610 に答える
2

std::stackたとえば、次のように例外が必要な場合は、既存のものを使用してラップします (簡単にテンプレート化できることに注意してください)。

class protectedstack
{
private:
    std::stack<int> stack;
    const int myarbitraryupperlimit = 100;
public:
    void pop() 
    {
        if(stack.empty()) 
        {
            throw new StackUnderFlowException();            
        }
        stack.pop();
    }
    void push(const int& value)
    {
        if(stack.size()>=myarbitraryupperlimit)
        {
            throw new StackOverFlowException();
        }
        stack.push(value);
    }
    // Similar for top/empty/constructors/...
};
于 2012-04-29T23:26:11.503 に答える
1

データの型、Top と Pop が返すもの、および Push が引数として取るものは、スタックに含まれるものです。それは、これをスタックにしたいもののタイプで置き換えるものです。

于 2012-04-29T23:11:43.867 に答える
1

これはスタックです:

スタック

このように考えてみてください: 他の本を動かさずに本を追加する唯一の方法は、一番上に置くことです: これがその方法Pushです。したがって、 を呼び出すことPush(Book1)で、Book1 を山の上に置くことになります。

同様に、他の本を移動せずに本を取り除く唯一の方法は、一番上にある本を取ることPopです。したがって、 を呼び出すPop()ことで、スタックの一番上にある本 (画像では緑色の本) を取得 (およびスタックから削除) することになります。

何か足りないのですか、それともこれはあなたの質問ですか?

于 2012-04-29T23:15:55.690 に答える
1

それはすべてtop変数にあります。この変数は、現在のトップであるオブジェクトを決定します。するとpop()top変数が減少します。つまり、上部が以前の場所より 1 つ下になります。するとpush()、インクリメントされます-トップは、以前の場所より1つ上になりました。この変数は、スタックの LIFO 機能を説明するものです。

もちろん、templateクラスを a などで動作させることもできFoodOrderます。

于 2012-04-29T23:38:59.577 に答える
1

混乱の理由がわかりません。データは「データ」変数に入ります。

したがって、テンプレートを使用してデータ バッファーに何でも保持できるようにするか、データの型を具体的に必要なものに変更します。

たとえば、FoodOrder クラスがある場合、次のようにすることができます (私の C++ は錆びていますが、これが基本的な要点です)。

FoodOrder *data[MAX_SIZE];

それに応じて FoodOrder ポインター/参照を受け入れるようにプッシュ/ポップパラメーターを変更する必要があり、設定は完了です。

PS std::stack の使用について - これはより良い解決策かもしれませんが、彼の特定の質問には答えません。

PS 2 Poster は次のように書いています。本当に?では、なぜ彼はまだ答えを選んでいないのでしょうか? これは宿題のようなにおいがしますか?

于 2012-04-30T00:41:34.713 に答える