栈顶指针指向最后一个元素,进行栈的插入时,可以使用语句top=LinkNode<T>(x, top);
template<class T>
struct LinkNode{
T data;
LinkNode<T> *link;
LinkNode<T>(T &x, LinkNode<T>*p=NULL):data(x),link(p){}
};
template<class T>//链式栈和顺序栈还是有些不一样的,比如说栈中元素的访问,要用指针一个个找下去
class LinkStack{
public:
LinkStack():top(NULL){}
~LinkStack(){makeEmpty();}
void Push(const T&x);//进栈
bool Pop(T& x);
bool getTop(T& x)const;
bool IsEmpty()const{return (top==NULL)?true:false;}
int getSize()const;
void makeEmpty();//清空栈中的内容
friend ostream& operator<<(ostream& os, LinkStack<T>& s);
private:
LinkNode<T> *top;//栈顶指针,即链头指针
};
template<class T>
void LinkStack<T>::makeEmpty(){
LinkNode<T> *p;
while(top!=NULL){
p=top;
top=top->link;
delete p;
}
}
template<class T>
void LinkStack<T>::Push(const T&x){//在栈中插入元素
top=new LinkNode<T>(x, top);//这条语句很好
assert(top!=NULL);
}
template<class T>
bool LinkStack<T>::Pop(T& x){//出栈
if(IsEmpty())return false;
LinkNode<T> *p=top;
x=top->data;
top=top->link;
delete p;
return true;
}
template<class T>
bool LinkStack<T>::getTop(T& x)const{
if(IsEmpty())return false;
x=top->data;
return true;
}
template<class T>
int LinkStack<T>::getSize()const{
LinkNode<T> *p=top;
int sum=0;
while(p!=NULL){
sum++;
p=p->link;
}
return sum;
}
template<class T>
ostream& operator<<(ostream& os, LinkStack<T>& s){
os<<"栈中元素个数="<<s.getSize()<<endl;
LinkNode<T> *p=s.top;
int i=s.getSize();
while(p!=NULL){
os<<"第"<<i--<<"个元素为"<<p->data;
p=p->link;
}
return os;
}