一、链式栈的定义
链式栈是一种数据存储结构,可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。
即用链式存储方式的方法来实现栈
二、链式栈的基本操作
InitLinkStack(&S):初始化栈。构造一个空栈 S,分配内存空间。
DestroyLinkStack(&S):销毁栈。销毁并释放栈 S 所占用的内存空间。
Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶。
Pop(&S,&x):出栈,若栈S非空,则弹出栈顶元素,并用x返回。
GetTop(S, &x):读栈顶元素。若栈 S 非空,则用 x 返回栈顶元素
其他常用操作:
LinkStackEmpty(S):判断一个栈 S 是否为空。若S为空,则返回true,否则返回false。
三、代码实现
1)Push 入栈
//入栈 类似不带头结点的链表的头插法
bool Push(LinkStack &Ls,etype e){
SNode *p = (SNode*)malloc(sizeof(SNode));
p -> data = e;
p -> next = Ls;
Ls = p;
return true;
}
2)Pop出栈
//出栈
bool Pop(LinkStack &Ls,etype &e){
if(NULL == Ls)
return false;
else{
SNode *p = Ls;
e = p -> data;
Ls = p -> next;
free(p);
return true;
}
}
3)判断空栈
bool StackEmpty(LinkStack Ls){
if(Ls == NULL)
return false;
else
return true;
}
4)查看栈顶
bool GetTop(LinkStack Ls,etype e){
if(Ls == NULL)
return false;
else{
e = Ls -> data;
}
return true;
}
5)销毁栈
//销毁链栈,双指针,p带路,pre销毁
bool DestroyStack(LinkStack &Ls){
SNode *pre = Ls;
SNode *p; //p是带路的
if(pre == NULL)
return false;
p = pre -> next;
while (p != NULL){
free(pre);
pre = p;
p = p -> next;
}
free(pre);
return true;
}