链栈:与单链表类似。但是链栈只能在一端存取数据,所以将链的头部作为栈顶,尾部作为栈底方便存取数据。
链栈只有一个top指针,而且不需要定义头结点。
入栈操作,不需要判断是否栈满,因为链式存储是动态存储,可以动态的分配内存空间。
出栈操作,需要判断是否栈空。
#include<iostream>
using namespace std;
template<class DataType>
struct Node
{
DataType data;
Node<DataType> *next;
};
template<class DataType>
class LinkStack
{
private:
Node<DataType> *top;
public:
LinkStack();//构造函数
~LinkStack(){}//析构函数
void Push(DataType x);//入栈
DataType Pop();//出栈
DataType getTop();//取栈顶元素
int Empty();//判空
};
template<class DataType>
LinkStack<DataType>::LinkStack()
{
top=NULL;
}
template<class DataType>
void LinkStack<DataType>::Push(DataType x)
{
Node<DataType> *s;
s=new Node<DataType>;
s->data=x;
s->next=top;
top=s;
}
template<class DataType>
DataType LinkStack<DataType>::Pop()
{
DataType x;
Node<DataType> *p;
if(top==NULL) throw "下溢";
x=top->data;
p=top;
top=top->next;
delete p;
return x;
}
template<class DataType>
DataType LinkStack<DataType>::getTop()
{
DataType x;
if(top==NULL) throw"下溢";
x=top->data;
return x;
}
template<class DataType>
int LinkStack<DataType>:: Empty()
{
if(top==NULL)
return 1;
else
return 0;
}
int main()
{
LinkStack<int>l1;
for(int i=0;i<5;i++)
{
l1.Push(i);
}
while(l1.Empty()!=1)
{
cout<<l1.Pop()<<endl;
}
cout<<l1.Empty();
return 0;
}