Я пытался представить стеки как шаблон, я использовал структуру, и все было хорошо, но каждый раз, когда я хотел написать функцию шаблона, мне приходилось писать тот же оператор шаблона, который казался неправильным, хотя работающий-

Итак, как я могу написать один шаблонный оператор для всех функций? Вот мой код:

template <typename T>
struct Stack
{
    T Value;
    Stack* next;
};
template <typename T>
void Push(T Value,Stack* &Top)
{
    Stack * Cell = new Stack();
    Cell->Value = Value;
    Cell->next = Top;
    Top = Cell;
};
template <typename T>
bool IsEmpty(Stack * Top)
{
    return (Top==0);
}
template <typename T>
void Pop(T &Value,Stack* &Top)
{
    if (IsEmpty(Top))
        cout  * Temp = Top;
        Value = Top->Value;
        Top = Top->next;
        delete Temp;
    }
}
template <typename T>
void GetTop(T &Value, Stack* &Top)
{
    if (IsEmpty(Top))
        cout Value;
}
template <typename T>
void EmptyStack(Stack * &Top)
{
    Stack * Temp;
    while (!(IsEmpty(Top)))
    {
        Temp = Top;
        Top = Top->next;
        delete Temp;
    }
}

Надеюсь, что я имею в виду, теперь ясно, извините за небольшой вопрос :(

Заранее спасибо.

0
Tamer Shlash 25 Ноя 2010 в 06:58
2
Хм ... у вас, кажется, есть фундаментальное недопонимание как шаблонов, так и объектов. Здесь вы пишете код в стиле C-ish - вместо того, чтобы создавать функции-члены, вы создаете бесплатные функции, которые принимают указатель на экземпляр. Кроме того, это даже не должно компилироваться, потому что вы не можете объявить Stack* без параметра шаблона.
 – 
Charles Salvia
25 Ноя 2010 в 07:04
Я четко понимаю шаблоны и ООП, но мои причины указаны в моих комментариях к ответу ниже, и я использовал этот код в полностью работающей программе, используя консольное приложение.
 – 
Tamer Shlash
25 Ноя 2010 в 07:12

2 ответа

Лучший ответ

Если (как видно из вашего комментария) вы хотите, чтобы они были бесплатными функциями, вы не можете. Вам также придется изменить параметр 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 кажется (по крайней мере, для меня) гораздо более разумным, чем выделение а Stack<T>. Стек, содержащий несколько узлов, имеет смысл, а стек, содержащий несколько стеков, на самом деле нет.

3
Jerry Coffin 25 Ноя 2010 в 08:04
Я не совсем понял, что вы сказали о самом стеке и узле, какой дизайн вы предлагаете вместо этого?
 – 
Tamer Shlash
25 Ноя 2010 в 07:45
Зачем нужна ссылка на указатель на Stack ? Почему не просто Stack<T> &s?
 – 
Alex Budovski
25 Ноя 2010 в 08:41
@Alex: Теперь, когда вы упомянули об этом, вы, вероятно, не знаете - я скопировал эту часть из его кода, не обновляя ее.
 – 
Jerry Coffin
25 Ноя 2010 в 08:43

Вместо этого вы можете просто написать шаблонный класс и записать все эти функции как методы этого класса. Затем они будут использовать те же параметры шаблона, что и класс.

0
Etienne de Martel 25 Ноя 2010 в 07:03
Я сделал, но на самом деле я пытаюсь представить стек в обоих направлениях
 – 
Tamer Shlash
25 Ноя 2010 в 07:05
Есть особая причина?
 – 
Etienne de Martel
25 Ноя 2010 в 07:06
Да, есть, я на самом деле пишу полу-лекцию, а читатели еще не выучили классы, поэтому я должен показать им отличное использование шаблонов, представляя стек, но без ООП
 – 
Tamer Shlash
25 Ноя 2010 в 07:10