【数据结构】第三章栈和队列:栈的基本概念、顺序存储实现、链式存储实现

本文详细介绍了栈的基本概念,包括栈的定义、特点和基本操作。接着,通过两种不同的顺序存储方式讲解了顺序栈的实现,包括初始化、进栈、出栈和读栈顶操作。此外,还探讨了栈的链式存储实现,重点是链栈的定义和代码实现。文章最后讨论了顺序栈的局限性,并提出了解决栈大小不可变问题的方案——使用链栈或共享栈。
摘要由CSDN通过智能技术生成

目录

3.1_1 栈的基本概念

 一、栈的定义

二、栈的基本操作

3.1_2 栈的顺序存储实现

一、顺序栈的定义、初始化、判空

 二、进栈操作

三、出栈操作

四、读栈顶操作

第一种方法的完整代码(top指针指向当前栈顶元素)

五、另一种实现方式(top指针指向栈顶元素的下一个位置)

六、销毁栈 

3.1_3 栈的链式存储实现

一、链栈的定义

二、链栈的代码实现(带头结点的单链表,头插头删)


3.1_1 栈的基本概念

 一、栈的定义

栈(Stack)只允许在一端进行插入或删除操作线性表

栈的逻辑结构与普通线性表相同,但是在插入、删除上会有区别。

特点:后进先出 Last In First Out(LIFO

重要术语:

栈顶:允许插入和删除的一段;

栈底:不允许插入和删除的一段;

空栈:没有数据元素的栈;

二、栈的基本操作

InitStack(&S)

初始化

构造一个空栈S,分配内存空间

DestroyStack(&S)

销毁

销毁并释放栈S所占的内存空间

Push(&S, x)

进栈

若S未满,则将x加入使之成为新栈顶

Pop(&S, &x)

出栈(删除栈顶元素)

若栈S非空,则弹出栈顶元素,并用x返回;

GetTop(S, &x)

读栈顶元素(不删除栈顶元素)

若栈S非空,则用x返回栈顶元素;

StackEmpty(S)

判断一个栈S是否为空

若S为空,则返回true,否则返回false;

关于查找操作,栈的使用场景中大多只访问栈顶元素,所以用GetTop(S, &x)读取栈顶元素就可以了。

常考题型:

Q:分别有五个数据元素a, b, c, d, e,它们的进栈顺序也是如此,问有哪些合法的出栈顺序?

A:思路:元素不是一口气全都进栈的,所以不只有e, d, c, b, a,这一种出栈顺序;它也可以先a, b,进栈,再b, a,出栈,然后再c, d, e,的进栈、出栈,所以出栈顺序有很多,就不一一列举了;那么合法的出栈顺序一共有多少种呢?

n个不同元素进栈,出栈元素不同排列的个数为{1/(n+1)}C(下2n上n)。上述公式称为卡特兰(Catalan)数,可采用数学归纳法证明(不要求掌握)。

{1/(5+1)}C(下5上10) = (10 * 9 * 8 * 7 * 6)/(6 * 5 * 4 * 3 * 2 * 1) = 42

3.1_2 栈的顺序存储实现

 

顺序栈的实现有两种方式,区别在于top指针的位置,top指针读起来有“指针”两个字,但是它是int整型变量,存放的是栈顶的位置;

第一种方法:top指针指向栈顶元素,初始化时top = -1,打个比方理解的更容易一点,就是指向了羽毛球筒里的第一个要被拿出来的羽毛球(已存在元素)的位置;

第二种方法:top指向栈顶元素的下一位,初始化时top = 0,再用相同的场景,就是指向羽毛球筒里下一个羽毛球要被放入的位置;

一、顺序栈的定义、初始化、判空

顺序栈的存储方式为顺序存储:给数据元素分配连续的存储空间,大小为:MaxSize * sizeof(ElemType)&#x

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值