❤️数据结构之栈(图文版详解)❤️

目录

一,写在前面

二,栈的定义

1,栈的定义

2,进栈出栈变化形式 

三,栈的抽象数据类型

四,栈顺序存储结构及实现

1,栈的顺寻存储结构

 2,栈的顺序存储结构——进栈操作

3,栈的顺序存储结构——出栈操作

五,两栈共享空间

六,栈的链式存储结构及实现

1,栈的链式存储结构

2,栈的链式存储结构——进栈操作

3, 栈的链式存储结构——出栈操作

七,全部代码

1,顺序栈

 2,两栈共享空间

3,链栈


一,写在前面

不知道大家有投有玩过手枪,估计都投有。现在和平年代,上哪去玩这种危险的 真东西,就是仿真玩具也大都被限制了.我高中在军训时,也算是一次机会,几个老兵和我们学生聊天,让我们学习了下关于枪的知识。

在你准备用枪的时候,那基本到了不是你死就是我亡的时刻,突然手枪明明有子弹却打不出来,这不是要命吗?而左轮手枪就不存在这问题,这一颗不行,转到下颗就可以 了,人总不会倒霉到六颗全是臭弹, 当然,后来子弹质量基本过关了,由于弹夹可以 8颗颗甚至20颗子弹,比左轮手枪的只能放6颗子弹要多,所以后来普及率更高的弹夹手枪。

二,栈的定义

1,栈的定义

在我们软件应用 ,栈这种后进先出数据结构的应用是非常普遍的。比如你用浏览器上网时不管什么浏览器都有 个"后退"键,你点击后可以接访问顺序的逆序加载浏览过的网页。比如你本来看着新闻好好的,突然看到有个链接说,有个可以让 你年薪100万的工作,你毫不犹豫点击它, 跳转进去一看,这都是啥呀,具体内容我 也就不说了,骗人骗得一点水平都没有 时你还想回去继续看新闻 就可以点击左 上角的后退 。即使你从一个网页开始 连续点了几十个链接跳转 你点"后退',页面跳转到前一步。

很多类似的软件,比如 Word Photoshop 等文档或图像编 软件中 都有撤销 )的操作,也是用栈这种方式来实现的,当然不同的软件具体实现代会有很 大差异,不过原理其实都是一样的。

栈( stack )是限定仅在表尾进行插入和删除操作的线性表

我们把允许插入和删除的一端称为栈顶 top ,另一端称为栈底 bottom。不含任何数据元素的栈称为空栈,又称为后进先出 (Last In Filrst Out) 的线性表,简 LlFO 结构。

栈的插入操作,叫作进栈,也称压栈、类似子弹入弹夹。

栈的删除操作,叫作出栈,也有的叫作弹栈。如同弹夹中的子弹出夹。

2,进栈出栈变化形式 

最先进栈的元素,是不是就只能是最后出栈呢?

举例来说,如果我们现在是有3个整型数字元素 1,2.3以次进栈,会有哪些出栈次序呢?

第一种: 1,2,3进,再 3,2,1出。这是最简单的最好理解的 一种,出栈次序为 321 。

第二种: 1进, 1出, 2进,2出, 3进, 3出。也就是进一 就出一个,出 枝次序为 123 。

第三种: 1进,2进, 2出, 1出, 3进,3出。出栈次序为 213。

第四种:1进,1出,2进,3进,3出,2出。出栈次序为132。

第五种:1进,2进,2出,3进,3出,1出。出栈次序为231。

从这个简单的例子就能看出,只是3个元素,就有5种可能的出栈次序,如果元素数量多,其实出栈的变化将会更多的。这个知识点一定要弄明白。 从这个简单的例子就能看出,只是3个元素,就有5种可能的出栈次序,如果元素数量多,其实出栈的变化将会更多的.这个知识点一定要弄明白。

三,栈的抽象数据类型

对于栈来讲,理论上线性表的操作特性它都具备,可由于它的特殊性,所以针对它在操作上会有些变化。特别是插入和删除操作,我们改名为 push和 pop,英文直译的话是压和弹,更容易理解。你就把它当成是弹夹的子弹压入和弹出就好记忆了,我们一般叫进栈和出栈。 对于栈来讲,理论上线性表的操作特性它都具备,可由于它的特殊性,所以针对它在操作上会有些变化.特别是插入和删除操作,我们改名为推和POP,英文直译的话是压和弹,更容易理解。你就把它当成是弹夹的子弹压入和弹出就好记忆了,我们一般叫进栈和出栈。

ADT 栈(stack)
Data

  同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。
operation

InitStack(*S):初始化操作,建立一个空栈S.
DestoryStack (*S):若栈存在,则销毁它。
ClearStack(*s):将栈清空。
StackEmpty (s):若栈为空,返回true,否则返回false。
GetTop (s, *e):若栈存在且非空,用e返回S的栈顶元素。
Push(*S,e):若栈S存在,插入新元素e到栈s中并威为栈顶元素。
Pop (*s,*e):删除栈S中栈顶元素,并用e返回其值。
StackLength(S):返回栈s的元素个数。

endADT


四,栈顺序存储结构及实现

1,栈的顺寻存储结构

既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈。线性表是用数组来实现的,想想看,对于栈这种只能一头插入删除的线性表来说,用数组哪一端来作为栈顶和栈底比较好?
对,没错,下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底。
我们定义一个 top变量来指示栈顶元素在数组中的位置,这 top就如同中学物理学过的游标卡尺的游标,如图,它可以来回移动,意味着栈顶的 top可以变大变小,但无论如何游标不能超出尺的长度。同理,若存储栈的长度为StackSize,则栈顶位置top 必须小于 StackSize。当栈存在一个元素时,top等于0,因此通常把空栈的判定条件定为 top等于一1。

 栈的结构定义

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */
typedef int SElemType; /* SElemType类型根据实际情况而定,这里假设为int */

/* 顺序栈结构 */
typedef struct
{
        SElemType data[MAXSIZE];
        int top; /* 用于栈顶指针 */
}SqStack;

若现在有一个栈,StackSize是5,则栈普通情况、空栈和栈满的情况示意图如图 若现在有一个栈,StackSize是5,则栈普通情况、空栈和栈满的情况示意图如图

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

-孤单又灿烂的神-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值