在自己编写模板链栈的时候,我遇到了问题,我想将链栈的结构体模板化,如下
template<typename DATA>
struct LinkNode
{
DATA st;
LinkNode * next;
};
紧接着我定义链栈类,也是模板,将节点泛化。但在定义时出现很多问题。
template<typename DATA>
class CChenyuStack
{
public:
CChenyuStack();
bool StackEmpty();
void push(DATA x);
DATA pop();
private:
LinkNode * mp_head;
int count;
};
比如结构体的声明问题。
由此发现知识漏洞:
1.将类模板化的时候,结构体应该嵌套声明,否则无法识别。
代码如下:
template<typename DATA>
class CChenyuStack
{
public:
CChenyuStack();
bool StackEmpty();
bool push(DATA x);
DATA pop();
private:
struct CLinkNode
{
DATA st;
CLinkNode * next;
};
CLinkNode * mp_head;
int count;
};
template<typename DATA>
CChenyuStack<DATA>::CChenyuStack()
{
mp_head = NULL;
count = 0;
}
template<typename DATA>
bool CChenyuStack<DATA>::push(DATA x)
{
if(mp_head == NULL)
{
mp_head = new CLinkNode;
mp_head->st = x;
mp_head->next = NULL;
}
else
{
CLinkNode *p = new CLinkNode;
p->st = x;
p->next = mp_head;
mp_head = p;
}
count++;
return true;
}
template<typename DATA>
DATA CChenyuStack<DATA>::pop()
{
if(mp_head == NULL)
{
cout<<"指针是零";
return;
}
CLinkNode *p = mp_head;
mp_head = p->next;
DATA x = p->st;
delete p;
return x;
}
template<typename DATA>
bool CChenyuStack<DATA>::StackEmpty()
{
return(mp_head->next == NULL);
}
以上为分析结果,不知道有没有其他的办法来泛化结构体。