自己写了一个模板栈,用的是链表(PS: 在链表节点这个问题上出现了问题)
当使用结构体作为节点时,栈和驱动程序可以运行可是当用一个类来代替结构体作为一个节点时,出现了各种各样的错误。
结构体:
struct Node <----SUCCEED
{
T data;
Node<T> *link;
};
类 :
class Node
{
friend class LinkedStack;
private :
T data;
Node<T> *link;
};
出现的错误:
希望有写过栈链表的指点一下 你少了类模板申明 template<class T> 荒年 发表于 2016-6-21 13:58
你少了类模板申明
有加,这个写有 我自己写了一个#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 14:30
我自己写了一个
是可以的,注释掉的是struct,是可以用的。我也是菜鸟,相互学习
你这样是吧结点和操作放到了同一个类里。而我是把结点作为一个类,然后操作作为友元 荒年 发表于 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]