【笔记】【数据结构】栈

本文详细介绍了栈这一数据结构,包括线性表的特点、栈的定义、存储方式(顺序存储与链式存储)、操作(入栈与出栈)、实际应用(括号匹配与后缀表达式)。栈被比喻为一摞盘子,强调了其后进先出的特性,并分析了两种存储方式的优缺点。
摘要由CSDN通过智能技术生成

线性表

线性表的特点:
1:有限,线性表的元素个数称为线性表的长度
2:有序,一个接着一个,除了首位外,每个元素有个前驱元素和一个后继元素,元素间是一对一的关系。

1.什么是栈

栈是限定仅在表尾进行插入和删除的线性表

栈就像是一摞盘子,每次洗碗时将盘子一个接着一个向上叠,使用时从上往下一个一个取,后放上去的在顶部,先使用,先放上去的在底部,后使用。

如上图:我们对栈的基本操作有进栈(压栈)和出栈.(弹栈)。

2.存储方式

栈有两种存储方式,一种是顺序存储,另一种是链式存储。

1 )顺序存储

:通过一维数组来实现。栈是要在表尾(栈顶)入栈出栈的,那么我们用数组的哪一端做栈底呢?
用下标为0的一端做栈底比较方便,因为栈顶要不断进行操作。
首先要设计一个结构体,它包含一个数组用来存数据,一个变量记录栈顶的位置。

#define MAXSIZE 100
typedef int SElemType;//栈的元素类型StackElementType
typedef struct {
   
	SElemType a[MAXSIZE];
	int top;
}sqstack;
//申请空间,将栈顶指针置为-1表栈空
sqstack A;
A.top=-1;

然后设计两个函数实现入栈,出栈操作

入栈 出栈操作

//入栈
int Push(sqstack *s,SElemType e){
   
	if(s->top==MAXSIZE-1)//如果栈满了就返回-1
		return -1;
	s->top++;      //如果没满就将将栈顶指针上移一位
	s->a[s->top]=e;//将元素信息存入
	return 1;      //返回1表示成功入栈
}
//出栈,e用来存储栈顶元素
int Pop(sqstack *s,SElemType *e){
   
	if(s->top==-1)//如果已经栈空返回-1
		return -1;
	*e=s->a[s->top--];//栈未空时将栈顶元素存入e中,栈顶指针下移
	return 1;
}

优缺点

优点是代码简洁,操作简单,缺点是事先规定了栈大小,元素过少空间浪费,元素过多空间不够

2)链式存储

可以动态的申请空间,解决这个问题
我们用单链表来实现链栈
*思考一下:用链表的哪一头来做栈底,哪一头做栈顶呢?*

栈要在栈顶对数据入栈出栈,我们要考虑单链表每个节点指向下个节点,它无法访问上个节点,所以当一个元素出栈后,为了能找到栈里的元素,应该采用头插法实现入栈。

链栈需要的函数较多

链栈的函数

Stack *CreatStack();//创建
int PushStack(Stack *stack,DateType date);//入栈
int PopStack(Stack *stack);//出栈,把动态申请的空间给free了
DateType GetTopElement(Stack *stack);//获得栈顶元素
void DestoryStack(Stack *stack);//销毁
int IsEmpty(Stack *stack);//判断栈是否空了,类似上面top==-1
void StackEmpty(Stack 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值