简介
链栈是一种基于链表结构实现的栈,栈是一种具有后进先出(LIFO)特性的数据结构,只允许在栈顶进行插入(入栈)和删除(出栈)操作。
链栈由节点构成,每个节点包含两部分:数据域和指针域。数据域存储实际的数据,指针域指向下一个节点。链栈没有固定的容量限制,可以动态地增加或减少节点,因此在内存利用上比顺序栈更加灵活。
链栈节点结构
- 数据域:存储栈中的数据元素。
- 指针域:指向下一个节点的指针。
struct StackNode {
DataType data; // 数据域,存储数据元素
StackNode* next; // 指针域,指向下一个节点
};
链栈结构
- 头指针指向链栈的头节点(栈底),用于链栈的初始化。
- 栈顶指针指向链栈的栈顶节点,表示当前栈顶元素的位置。
struct LinkStack {
StackNode* top; // 栈顶指针
};
链栈的基本操作
初始化操作
创建一个空链栈,并将栈顶指针置空。
bool InitStack(LiStack &Li){
Li=(Linknode *)malloc(sizeof(Linknode));//分配头节点
if(Li==NULL){
return false;
}
Li->next=NULL;
return true;
}
判空
bool Empty(LiStack Li){
if(Li->next==NULL){//头节点下一个为空
return true;
}
return false;
}
入栈
bool InsertLiStack(LiStack &Li,int e){
if(Li->next==NULL){//头节点下一个为空
return false;
}
Linknode *s;
s==(Linknode *)malloc(sizeof(Linknode));
s->data=e;
s->next=Li->next;
Li->next=s;
return true;
}
出栈
bool DeleteLiStack(LiStack &Li,int e){
if(Li->next==NULL){//头节点下一个为空
return false;
}
Linknode *s;
s==(Linknode *)malloc(sizeof(Linknode));
s->next=Li->next;
e=s->next->data;
Li->next=s->next;
return true;
}
获得栈顶元素
bool GetElem(LiStack Li,int &x){
if(Li->next!=NULL){
x=Li->next->data;
return x;
}
return false;
}
链栈小结
链栈的优点是可以动态地分配内存空间,不受固定容量的限制,但相应地会增加一定的内存开销。链栈适用于不确定栈大小的情况,或者在栈操作频繁、容量需求不断变化的场景下。
完整代码实现
#include<stdio.h>
#include<stdlib.h>
typedef struct Linknode{
int data;
struct Linknode *next;
} Linknode,*LiStack;
//初始化一个链栈
bool InitStack(LiStack &Li){
Li=(Linknode *)malloc(sizeof(Linknode));//分配头节点
if(Li==NULL){
return false;
}
Li->next=NULL;
return true;
}
//判空
bool Empty(LiStack Li){
if(Li->next==NULL){//头节点下一个为空
return true;
}
return false;
}
//入栈
bool InsertLiStack(LiStack &Li,int e){
if(Li->next==NULL){//头节点下一个为空
return false;
}
Linknode *s;
s==(Linknode *)malloc(sizeof(Linknode));
s->data=e;
s->next=Li->next;
Li->next=s;
return true;
}
//出栈
bool DeleteLiStack(LiStack &Li,int e){
if(Li->next==NULL){//头节点下一个为空
return false;
}
Linknode *s;
s==(Linknode *)malloc(sizeof(Linknode));
s->next=Li->next;
e=s->next->data;
Li->next=s->next;
return true;
}
//获得栈顶元素
bool GetElem(LiStack Li,int &x){
if(Li->next!=NULL){
x=Li->next->data;
return x;
}
return false;
}
int main(){
LiStack l;
bool nool=InitStack(l);
if(nool){
printf("true");
}
else{
printf("false");
}
}