数据结构之链栈

本文介绍了链栈,一种基于链表的可动态扩展的栈数据结构,包括其节点结构、初始化、判空、入栈、出栈和获取栈顶元素等操作。特别强调了链栈在内存利用上的优势和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

链栈是一种基于链表结构实现的栈,栈是一种具有后进先出(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");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云里雾里!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值