Я пытался представить стеки как шаблон, я использовал структуру, и все было хорошо, но каждый раз, когда я хотел написать функцию шаблона, мне приходилось писать тот же оператор шаблона, который казался неправильным, хотя работающий-
Итак, как я могу написать один шаблонный оператор для всех функций? Вот мой код:
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; } }
Надеюсь, что я имею в виду, теперь ясно, извините за небольшой вопрос :(
Заранее спасибо.
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>
. Стек, содержащий несколько узлов, имеет смысл, а стек, содержащий несколько стеков, на самом деле нет.
Stack<T> &s
?
Вместо этого вы можете просто написать шаблонный класс и записать все эти функции как методы этого класса. Затем они будут использовать те же параметры шаблона, что и класс.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
Stack*
без параметра шаблона.