链栈和顺序栈不同,链栈是采用一个个存储结点来存储数据的。它不像顺序栈在地址上是连续的线性存储结构。所有的存储单元可以占用连续或不连续的存储区域。每个存储单元在存储栈中的元素a1的同时,也存储其逻辑后继a2的存储地址。
typedef struct node
{
int data;//存放数据
struct node *next;//下一个结点的地址
}LinkNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;//栈顶指针
}LinkStack;
1、初始化空栈
void InitLinkStack(LinkStack *linkstack)
{
linkstack->top->data=0;
linkstack->top->next=NULL;
}
2、判断链栈是否为空
bool IsEmptyStack(LinkStack *linkstack)
{
if (!linkstack)
{
cout<<"该栈为空"<<endl;
return true;
}
else
return false;
}
3、元素入栈
LinkStack* PushElem(LinkStack *linkstack,int element)
{
if (IsEmptyStack(linkstack))
{
cout<<"该栈为空,无法插入元素"<<endl;
return linkstack;
}
else
{
LinkNode *newnode=new LinkNode;
if (!newnode)
{
cout<<"内存分配失败"<<endl;
return linkstack;
}
else
{
newnode->data=element;//把数据赋值给新的结点
newnode->next=linkstack->top;把原来栈顶的指针赋值给新的结点,新的结点称为新的栈顶
linkstack->top=newnode;//再把新的栈顶的指针赋给top指针
return linkstack;
}
}
}
4、元素出栈
bool PopElem(LinkStack *linkstack)
{
if (!linkstack)
{
cout<<"该栈为空,无法将栈顶元素弹出栈"<<endl;
return false;
}
else
{
int element=0;
LinkNode *deleNode=new LinkNode;//创建新的结点保存需要被删的结点
deleNode=linkstack->top;//把栈顶的指针赋给新创建结点
element=linkstack->top->data;//用局部变量存储栈顶的数据
cout<<element<<endl;//输出该数据
linkstack->top=deleNode->next;//把栈顶的下一个结点定为新的栈顶,相当于删除了旧的栈顶
delete deleNode;//删除旧的栈顶节点
deleNode=NULL;
return true;
}
}