template<classT>classLStack;//对链式栈类的声明template<classT>classSLNode{friendclassLStack<T>;//因为此处声明友元类,且该类为模板类,所以需要在之前对该类进行声明private:
T data;
SLNode<T>*next;};
链式栈类的定义
template<classT>classLStack{private:
SLNode<T>*top;//栈顶指针指向表头public:LStack();//构造函数 ~LStack();//析构函数voidClear();//栈的清空 boolPop(T &item);//弹栈,成功返回TrueboolPush(const T &item);//压栈,成功返回TrueboolPeek(T item);//访问栈顶元素 };
函数
template<classT>
LStack<T>::LStack(){
top =NULL;}template<classT>
LStack<T>::~LStack(){Clear();}template<classT>void LStack<T>::Clear(){
T item;while(top){this->Pop(item);}}template<classT>bool LStack<T>::Pop(T & item){
SLNode<T>*q;if(top ==NULL){
cout<<"栈空无法弹出"<<endl;returnfalse;}
item = top->data;
q = top->next;delete top;
top = q;returntrue;}template<classT>bool LStack<T>::Push(const T &item){
SLNode<T>* s =new SLNode<T>;
s->data = item;
s->next = top;
top = s;returntrue;}template<classT>bool LStack<T>::Peek(T item){if(top ==NULL){
cout<<"栈空"<<endl;returnfalse;}
item = top->data;returntrue;}
主函数调试代码
intmain(int argc,char**argv){int item,op;bool flag =false;
LStack<int>A;while(1){
cout<<"请输入操作数"<<endl<<"0 压栈 1 弹栈 2 访问栈顶元素 3 清空栈"<<endl;
cin>>op;if(op ==-1)break;switch(op){case0:{
cout<<"请输入压栈元素"<<endl;
cin>>item;
A.Push(item);break;}case1:{
flag = A.Pop(item);if(flag)
cout<<"已弹出栈顶元素"<<item<<endl;break;}case2:{
flag = A.Peek(item);if(flag)
cout<<"栈顶元素为"<<item<<endl;break;}case3:{
A.Clear();
cout<<"已清空"<<endl;break;}default:{
cout<<"操作数错误"<<endl;break;}}}}