#pragma once
using namespace std;
template<class T>
class LinkedStack;
template<class T>
class ChainNode
{
friend class LinkedStack<T>;
private:
ChainNode(const T& theData, ChainNode *n = 0)
:data(theData), link(n)
{
}
T data;
ChainNode<T> *link;
};
//链式堆栈
template<class T>
class LinkedStack
{
public:
LinkedStack() :top(0), size(0)//新创建堆栈的时候,堆栈为空
{
}
~LinkedStack()
{
MakeEmpty();//删除全部节点
}
bool IsEmpty() const;//判断栈是否为空
T& Top() const;//用来返回栈顶的数据
void Push(const T& e);//将新的数据压入堆栈
void Pop();//从栈顶删除
int Size() const;
void MakeEmpty();
private:
ChainNode<T> *top;//指向栈顶节点
int size;
};
//判断栈是否为空
template<class T>
bool LinkedStack<T>::IsEmpty() const
{
return top == 0;
}
//将新的数据压入堆栈
template<class T>
void LinkedStack<T>::Push(const T& e)
{
top = new ChainNode<T>(e, top);//连接节点
size++;
}
//用来返回栈顶的数据
template<class T>
T& LinkedStack<T>::Top() const
{
if (this->IsEmpty())
{
throw "Stack is empty.";
}
return top->data;
}
//从栈顶删除
template<class T>
void LinkedStack<T>::Pop()
{
if (this->IsEmpty())
{
throw "Stack is empty,cannot delete";
}
ChainNode<T> *delNode = top;//记录原来栈顶的指针
top = top->link;
delete delNode;
}
template<class T>
void LinkedStack<T>::MakeEmpty()
{
while (!IsEmpty())
{
Pop();
size--;
}
}
template<class T>
int LinkedStack<T>::Size() const
{
return size;
}