0

スタックをテンプレートとして表現しようとしてきましたが、構造体を使用してすべてがうまくいきましたが、テンプレート関数を作成するたびに、同じテンプレートステートメントを作成する必要がありました。働く-

では、すべての関数に対して1つのテンプレートステートメントを作成するにはどうすればよいですか?コードは次のとおりです。

テンプレート<タイプ名T>
構造体スタック
{{
    T値;
    次のスタック*;
};
テンプレート<タイプ名T>
void Push(T Value、Stack *&Top)
{{
    スタック*セル=新しいスタック();
    セル->値=値;
    Cell-> next = Top;
    上=セル;
};
テンプレート<タイプ名T>
bool IsEmpty(Stack * Top)
{{
    return(Top == 0);
}
テンプレート<タイプ名T>
void Pop(T&Value、Stack *&Top)
{{
    if(IsEmpty(Top))
        cout * Temp = Top;
        値=トップ->値;
        トップ=トップ->次;
        Tempを削除します。
    }
}
テンプレート<タイプ名T>
void GetTop(T&Value、Stack *&Top)
{{
    if(IsEmpty(Top))
        cout値;
}
テンプレート<タイプ名T>
void EmptyStack(Stack *&Top)
{{
    スタック*温度;
    while(!(IsEmpty(Top)))
    {{
        温度=上;
        トップ=トップ->次;
        Tempを削除します。
    }
}

私が言っていることが今はっきりしていることを願っています、ちょっとした質問でごめんなさい:(

前もって感謝します。

4

2 に答える 2

3

(あなたのコメントに基づくとそう思われるように)それらを無料の関数として欲しければ、それはできません。Stackまた、次のようにパラメータを変更する必要があります。

template <typename T>
void Push(T Value, Stack<T>* &Top)
{
    Stack * Cell = new Stack();
    Cell->Value = Value;
    Cell->next = Top;
    Top = Cell;
};

現状では、私はあなたのデザインにあまり興奮していません。Stackタイプを実際のスタックとしても、スタック内単一ノード(セル)としても使用しようとします。これはせいぜい不必要に混乱します。

編集:スタックとノードに関する限り、私が話しているのは(すぐ上のコードのように): -スタックに入る単一のセルを割り当てていますが、使用しているタイプStack *Cell = new Stack();です。_ Stack

代わりに次のようなことをします。

template <class T>
struct Stack { 
    struct node { 
        T data;
        node *next;
    };

    node *head;
};

template <class T> 
void push(T item, Stack<T> *&s) { 
    Stack<T>::node *n = new Stack<T>:node();       
    n->data = item;
    n->next = s->head;
    s->head = n;
}

実際に行っていることには大きな違いはありませんが、スタックに何かを置く場合、Stack<T>::node(少なくとも私にとっては)aを割り当てる方が、を割り当てるよりもはるかに理にかなっているようStack<T>です。複数のノードを含むスタックは理にかなっています-複数のスタックを含むスタックは実際には意味がありません。

于 2010-11-25T04:17:16.487 に答える
0

代わりにテンプレートクラスを記述し、それらすべての関数をそのクラスのメソッドとして記述することができます。その後、クラスと同じテンプレートパラメータを共有します。

于 2010-11-25T04:03:42.953 に答える