//linkstack.h
#ifndef LINKSTACK_H
#define LINKSTACK_H
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
template <class T>
struct Node
{
T data;
Node<T> *next;
};
template <class T>
class LinkStack
{
public:
LinkStack(){top=NULL;}
~LinkStack();
void Push(T x);
T Pop();
T GetTop();
bool Empty();
void Print();
private:
Node<T>*top;
};
template <class T>
LinkStack<T>::~LinkStack()
{
while(top!=NULL)
{
Node<T>*q=top;
top=top->next;
delete q;
}
}
template <class T>
void LinkStack<T>::Push(T x)
{
Node<T>*s=new Node<T>;
s->data=x;
s->next=top;
top=s;
}
template <class T>
T LinkStack<T>::Pop()
{
if(top==NULL) throw "下溢";
Node<T>*q=top;
int x=q->data;
top=top->next;
delete q;
return x;
}
template <class T>
T LinkStack<T>::GetTop()
{
if(top!=NULL) return top->data;
else return NULL;
}
template <class T>
bool LinkStack<T>::Empty()
{
return (top==NULL? 1:0);
}
template <class T>
void LinkStack<T>::Print()
{
Node<T>*p=top;
if(p==NULL) cout<<"此链栈为空栈!"<<endl;
else
{
while(p!=NULL)
{
cout<<" "<<p->data<<"\n";
p=p->next;
}
cout<<endl;
}
}
#endif
//main.cpp
#include "linkstack.h"
void main()
{
LinkStack<int> link;
int a[5]={1,2,3,4,5};
for(int i=0;i<5;i++)
link.Push(a[i]);
cout<<"该链栈的元素分别为(从栈顶到栈底的顺序依次输出):\n";
link.Print();
cout<<"栈顶元素为:";
if(link.GetTop()==NULL)
cout<<"(该栈链为空)\n";
else cout<<link.GetTop()<<endl;
cout<<"\n执行前三个元素出栈并输出,如下:"<<endl;
for(int j=0;j<3;j++)
cout<<link.Pop()<<" ";
if(link.Empty())
cout<<"\n\n此时链栈变成了空栈\n";
else cout<<"\n\n此时栈链还不是空栈\n";
cout<<"\n执行最后两个元素出栈并输出:"<<link.Pop();
cout<<" "<<link.Pop();
if(link.Empty())
cout<<"\n\n此时链栈变成了空栈\n";
else cout<<"\n\n此时栈链还不是空栈\n";
}
结果图:
我发现的那个好“过瘾”的问题是,看两张图划红线部分:
为什么的呢?