0

我一直在尝试将 Stacks 表示为模板,我使用了一个 struct 并且一切都很好,但是每次我想编写模板函数时,我都必须编写相同的模板语句,这似乎不正确 - 尽管在职的-

那么如何为所有函数编写一个模板语句?,这是我的代码:

模板 <类型名 T>
结构栈
{
    T值;
    堆栈*下一个;
};
模板 <类型名 T>
无效推送(T 值,堆栈* &顶部)
{
    堆栈 * 单元 = 新堆栈();
    单元格->值 = 值;
    单元格->下一个 = 顶部;
    顶部 = 单元格;
};
模板 <类型名 T>
布尔 IsEmpty(堆栈 * 顶部)
{
    返回(顶部==0);
}
模板 <类型名 T>
void Pop(T &Value,Stack* &Top)
{
    如果(IsEmpty(顶部))
        cout * 温度 = 顶部;
        价值=顶部->价值;
        顶部=顶部->下一个;
        删除临时;
    }
}
模板 <类型名 T>
void GetTop(T &Value, Stack* &Top)
{
    如果(IsEmpty(顶部))
        cout 值;
}
模板 <类型名 T>
void EmptyStack(Stack * &Top)
{
    堆栈*温度;
    而 (!(IsEmpty(Top)))
    {
        温度=顶部;
        顶部=顶部->下一个;
        删除临时;
    }
}

希望我的意思现在很清楚,抱歉这个小问题:(

提前致谢。

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;
}

它对你真正在做什么并没有太大的区别,但是当你把东西放到堆栈上时,分配 aStack<T>::node似乎(至少对我来说)比分配 a 更有意义Stack<T>。包含多个节点的堆栈是有意义的——包含多个堆栈的堆栈确实没有。

于 2010-11-25T04:17:16.487 回答
0

您可以简单地编写一个模板类,并将所有这些函数编写为该类的方法。然后它们将与类共享相同的模板参数。

于 2010-11-25T04:03:42.953 回答