施主请留步 发表于 2016-6-21 10:21:32

自己写了一个模板栈,用的是链表(PS: 在链表节点这个问题上出现了问题)

当使用结构体作为节点时,栈和驱动程序可以运行
可是当用一个类来代替结构体作为一个节点时,出现了各种各样的错误。
结构体:
struct Node        <----SUCCEED
{
        T data;
        Node<T> *link;
};
类 :
class Node
{
        friend class LinkedStack;
private :
        T data;
        Node<T> *link;
};
出现的错误:

施主请留步 发表于 2016-6-21 10:22:50

希望有写过栈链表的指点一下

荒年 发表于 2016-6-21 13:58:56

你少了类模板申明 template<class T>

施主请留步 发表于 2016-6-21 21:40:29

荒年 发表于 2016-6-21 13:58
你少了类模板申明

有加,这个写有

荒年 发表于 2016-6-22 14:30:42

我自己写了一个#define TYLIST(T)ListNode<T>*
//template<typename T>
//struct ListNode{
//        //数据成员
//        struct ListNode<T> *pre, *next;//双向列表
//        T info;
//        //构造函数
//        ListNode(){};
//        ListNode(T e, TYLIST(T) p1, TYLIST(T) p2) :info(e), pre(p1), next(p2){};//在函数形参之后大括号之前:是初始化操作
//        //操作接口
//        TYLIST(T) Insertpre(T const&el);//在当前节点之后插入节点
//        TYLIST(T) Insertnext(T const&el);//插入操作,在当前节点之后插入节点
//};//节点类
//template<typename T>
//TYLIST(T) ListNode<T>::Insertpre(T const &el)
//{
//        TYLIST(T) N = new ListNode(el,pre,this);
//        pre->next = N;
//        pre = N;//即,在this和this->pre之间插入N,建立相互之间的链接
//        return N;
//}
//template<typename T>
//TYLIST(T) ListNode<T>::Insertnext(T const &el)
//{
//        TYLIST(T) N= new ListNode(el,this,next);
//        next->pre = N;
//        next = N;
//        return N;
//}
template<class T>
class ListNode {
public:
        ListNode<T> *pre, *next;
        T info;
        //构造函数
        ListNode(){};
        ListNode(T e, TYLIST(T) p1, TYLIST(T) p2) :info(e), pre(p1), next(p2){};//在函数形参之后大括号之前:是初始化操作
        //操作接口
        TYLIST(T) Insertpre(T const&el);//在当前节点之后插入节点
        TYLIST(T) Insertnext(T const&el);//插入操作,在当前节点之后插入节点
};
template<typename T>
TYLIST(T) ListNode<T>::Insertpre(T const &el)
{
        TYLIST(T) N = new ListNode(el,pre,this);
        pre->next = N;
        pre = N;//即,在this和this->pre之间插入N,建立相互之间的链接
        return N;
}
template<typename T>
TYLIST(T) ListNode<T>::Insertnext(T const &el)
{
        TYLIST(T) N= new ListNode(el,this,next);
        next->pre = N;
        next = N;
        return N;
}
是可以的,注释掉的是struct,是可以用的。我也是菜鸟,相互学习

学习电脑 发表于 2016-6-22 16:07:03

来看看

施主请留步 发表于 2016-6-24 11:10:22

荒年 发表于 2016-6-22 14:30
我自己写了一个
是可以的,注释掉的是struct,是可以用的。我也是菜鸟,相互学习

你这样是吧结点和操作放到了同一个类里。而我是把结点作为一个类,然后操作作为友元

施主请留步 发表于 2016-6-24 11:11:56

荒年 发表于 2016-6-22 14:30
我自己写了一个
是可以的,注释掉的是struct,是可以用的。我也是菜鸟,相互学习

这是我单独写的栈链表#ifndef _ST_H_
#define _ST_H_

#include<iostream>
template <class T>
/*struct Node        <----SUCCEED
{
        T data;
        Node<T> *link;
};*/       
class Node
{
        friend class LinkedStack;
private :
        T data;
        Node<T> *link;
};
template <class T>
class LinkedStack
{
        public :
                LinkedStack(){top = 0;}
                ~LinkedStack();
                bool IsEmpty() const {return top == NULL;}
                bool IsFull() const;
                T Top() const;
                LinkedStack<T>& Add(const T& x);
                LinkedStack<T>& Delete(T& x);
        private :
                Node<T> *top;        //指向栈顶结点
};
template <class T>
LinkedStack<T>::~LinkedStack()
{
        Node<T> *next;
        while(top)
        {
                next = top -> link;
                delete top;
                top = next;
        }
}
template<class T>
bool LinkedStack<T>::IsFull()const
{
        //堆栈是否满
        Node<T> *p = new Node<T>;
        if(p == NULL)
                return true;
        return false;
}
template<class T>
T LinkedStack<T>::Top()const
{
        //返回栈顶元素
        if(IsEmpty()) exit(1);
        return top->data;
}
template<class T>
LinkedStack<T>& LinkedStack<T>::Add(const T& x)
{
        //添加元素x
        Node<T> *p = new Node<T>;
        p->data = x;
        p->link = top;
        top = p;
        return *this;
}
template<class T>
LinkedStack<T>& LinkedStack<T>::Delete(T& x)
{
        if(IsEmpty()) exit(1);
        x = top -> data;
        Node<T> *p = top;
        top = top->link;
        delete p;
        return *this;
}
#endif
页: [1]
查看完整版本: 自己写了一个模板栈,用的是链表(PS: 在链表节点这个问题上出现了问题)