我一直在尝试将Stacks表示为模板,我使用了一个结构,并且每件事情都很好,但每次我想编写模板函数时,我都必须编写相同的模板语句,这似乎并不像正确 - 尽职尽责 -
那么如何为所有函数编写一个模板语句?这是我的代码:
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 :(得分: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
类型用作实际堆栈,和作为堆栈中的单个节点(Cell)。这充其量是不必要的混淆。
编辑:就堆栈与节点而言,我所说的是(如上面的代码所示):Stack *Cell = new Stack();
- 你正在分配一个 in的单元格堆栈,但您使用的类型是 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>
。包含多个节点的堆栈是有意义的 - 包含多个堆栈的堆栈实际上没有。
答案 1 :(得分:0)
您可以简单地编写一个模板类,并将所有这些函数编写为该类的方法。然后,它们将与该类共享相同的模板参数。