template <class T>
class LinkStack
{

public:
  template <class T>
  class LinkStackNode
  {
  public:
    T data;
    LinkStackNode * link;
    LinkStackNode(T& value):link(NULL),data(value){}
  };

  LinkStack():top(NULL){}
  void Push(T& value);
  T& GetTop();
  T& Pop();
  bool IsEmpty();
  void MakeEmpty();

private:
    LinkStackNode<T> * top;
};

template<class T>
void LinkStack<T>::Push(T &value)
{
  LinkStackNode<T> * add=new LinkStackNode<T>(value);
  add->link=top;
  top=add;
}

template <class T>
T& LinkStack<T>::GetTop()
{
  if(top==NuLL)
  {
    cout<<"栈为空!"<<endl;
    exit(0);
  }
  else
  {
    return top->data;
  }
}

template <class T>
T& LinkStack<T>::Pop()
{
  if(top==NULL)
  {
    cout<<"栈为空!"<<endl;
    exit(0);
  }
  else
  {
    LinkStackNode<T> * old=top;
    top=top->link;
    T data=old->data;
    delete old;
    return data;
  }
}

template <class T>
bool LinkStack<T>::IsEmpty()
{
  return top==NULL;
}

template <class T>
void LinkStack<T>::MakeEmpty()
{
  while(!this->IsEmpty())
  {
    this->Pop();
  }
}