#include <iostream>
using namespace std;
template <class T> class LinkStack;
template <class T>
class LinkNode
{
friend class LinkStack<T>;
public:
private:
LinkNode(const T &dt, LinkNode *node = 0) :data(dt), link(node) {}
T data;
LinkNode *link;
};
template <class T>
class LinkStack
{
public:
LinkStack() { pop = 0; }
void Push(const T &data); //压栈
T & Top(); //获取栈顶元素
T Pop(); //弹出栈顶元素
bool isEmpty(); //判断栈是否为空
void makeEmpty(); //清空栈
~LinkStack();
private:
LinkNode<T> *pop;
};
template <class T>
void LinkStack<T>::Push(const T &data)
{
pop = new LinkNode<T>(data,pop);
}
template <class T>
T& LinkStack<T>::Top()
{
if (isEmpty()) throw "stack is empty";
else
return pop->data;
}
template <class T>
T LinkStack<T>::Pop()
{
if (isEmpty()) throw "stack is empty";
else
{
LinkNode <T> *del = pop;
T tmp = del->data;
pop = pop->link;
delete del;
return tmp;
}
}
template <class T>
bool LinkStack<T>::isEmpty()
{
return pop == 0;
}
template <class T>
void LinkStack<T>::makeEmpty()
{
while (!isEmpty())
{
Pop();
}
}
template <class T>
LinkStack<T>::~LinkStack()
{
makeEmpty();
}
int main()
{
int arry[5] = { 1,2,3,4,5 };
LinkStack<int> list;
list.Push(arry[0]);
cout << list.Top() << endl;
list.Push(arry[1]);
cout << list.Top() << endl;
list.Push(arry[2]);
cout << list.Top() << endl;
list.Push(arry[3]);
cout << list.Top() << endl;
list.Push(arry[4]);
cout << list.Top() << endl;
cout << endl << endl;
list.Pop();
cout << list.Top() << endl;
list.Pop();
cout << list.Top() << endl;
list.Pop();
cout << list.Top() << endl;
list.Pop();
cout << list.Top() << endl;
list.Pop();
return 0;
}
operation result