实现:
#include<iostream>
using namespace std;
template<typename E>
class node
{
public:
E data;
node<E>* next;
node(E it, node<E>*p = NULL)
{
data = it;
next = p;
}
~node()
{
cout<<data<<endl;
cout<<"析构函数"<<endl;
}
};
template<typename E>
class stack
{
private:
int size;
node<E>*top;
public:
stack()
{
size = 0;
top = NULL;
}
~stack()
{
clear();
}
void clear()
{
while (top != NULL)
{
node<E>*tmp = top;
top = top->next;
delete tmp;
}
size = 0;
}
void push(E it)
{
node<E>*p = new node<E>(it, top);
top = p;
size++;
}
bool pop()
{
if (size == 0)
{
cout << "empty" << endl;
return false;
}
else
{
cout << "元素为:" << top->data << endl;
node<E>*p = top;
top = top->next;
delete p;
p = NULL;
size--;
return true;
}
}
};
我觉得这里实现的有几个点比较有趣:
1、在这里我们并不需要额外的head和tail指针了,只需要一个top指针
top指针一开始可以赋值为null
insert一个元素的时候就可以把这个元素指向原来的top,top就指向这个新的元素,以此类推。
2、实现这个简单的stack没想到还学会了一个Primer 4的知识点
"the destructor does nothing to destroy members of built-in or pointer type"
一开始我在node里面加了个析构函数,删除了next这个指针。后来程序崩溃了,跟学长交流后发现,其实是我们的next被二次释放。
我就在想,奇了怪了,就算我不自己定义一个析构函数,内置的虚构函数也会做这些事情啊。但是
默认析构函数确实不进行内置类型和指针的撤消,内置类型成员和指针成员的撤消依赖于生命周期。
我们不自己定义,虚构函数是不会delete掉next的,但是我们自己定义之后,就会造成next的二次释放,从而程序崩溃
可怕。