数据结构学习笔记——栈(1)定义理解

写在前面的话——努力不晚

博主是某985学校数字媒体技术专业的本科在读生,即将成为大四狗,今后打算国内读研。

因为数媒专业设置的缘故,前两年尝试了很多艺术和设计方面的东西:素描、设计原理、UI、视频剪辑等等,但身在软件学院,又接触了很多和软件工程相关的专业课,可以说方向很多,但是让人眼花缭乱。

我记得大二下学期的三维建模(理论课,很多是数学的东西)课上老师问我们有多少人喜爱编程,当时20多个人的班上就2、3个人举手,我并没有举手。老师看到后很感叹,因为院里面数媒作为一个交叉专业,很容易让这个阶段的本科生纠结。大一大二的很多基础课里,老师把我们作为一个比较特殊(编程较弱)的团体,很多软工的课程设计、实训我们都没有,所以编程锻炼很少。(所幸我的后一届开始已经加上这些课设和实训)

随着到了大三,和软工的分界更为明显,学习了专属专业课:计算机动画、3ds max建模、Maya建模、曲线曲面造型、游戏制作(理论、写文档和unity实践)、虚拟现实、OpenGL等。对行业了解更多,也更充分感受到编程的重要性;在学习曲线曲面造型(用C和OpenGL)以及游戏制作实训(unity 3D)后,发现自己原来对编程没有那么讨厌,甚至很有成就感。这让我反思到之前也许只是一味回避,没有去尝试,自然也咀嚼不出甘甜。

在这个时间节点,不论是面对即将来临的保研、考研、面试,亦或是将来的研究生学习和就业,编程的基础都是我需要从头捡起来的。前段时间发现阅读程序的时候要去查很多语法和用法,从头理解,让我觉得大一的时候没有把C语言和数据结构的基础打牢非常遗憾。但是一味消沉并不是我的作风,行动起来才是关键。希望能通过这些总结让自己的知识体系更牢固,也欢迎各位的交流和指教。

2017年8月3日

1、何为“栈”

武汉有一条著名的美食小吃街叫做“户部巷”,天天人流如织,蔡林记的热干面、四季美的汤包、三鲜豆皮等小吃让人流连忘返。户部巷里有一栋古老的建筑叫做“祥盛堆栈”,是早些时候在码头做生意的人用来堆放货物的地方。堆栈的出现为生意人节省了空间、带来了方便,通常人们堆放物品的时候总是习惯把耐压的大件放在下面,易碎的小件放在上面;堆栈中的物品大多都是货物,因此得轻拿轻放,为了防止货物摔落,得一件件从上拿起,最底下的货物得等所有头上的货物搬开后才能搬走。



2、栈的定义

堆栈在现实生活中是一种很常用的行为,在计算机语言中,也把堆栈称为栈,它的定义是:一种限定仅在表尾进行插入或删除操作线性表。把句子进行提炼,“堆栈是一种限定操作的线性表”,也就是说其本质还是线性表,那么它就自然地继承了线性表的性质。


【线性表】
我们先来看一下线性表,简明定义:线性表是n个数据元素的有限序列。

通常把线性表的特点概括为以下四点:

1)有惟一的首元素。这个首元素只是被称作“第一个”,且只是相对整个线性表而言。

2)有惟一的尾元素。同样尾部也只是一个元素。

3)除首元素外,每个元素只有一个前驱。

4)除尾元素外,每个元素只有一个后继。


线性表这种结构“牵一发而动全身”,可以把它当做一挂鞭炮,每一个炮仗是一个数据元素,中间的导线是元素间的指针,引线就是首元素的位置。

我们可以点燃鞭炮中间任何一点的导线,鞭炮会分头炸完(危险勿试),这是因为对于每一点的数据元素都有传递的指针,这些指针贯穿了整个线性表。
我们可以把每个炮仗的火药倒出来,它的节点处会变为导线连接上下两个炮仗(线性表的删除)。
我们也可以找到加入点,把前后两端的引线绕到新的炮仗上面,使得它成为原前驱元素的后继,原后继元素的前驱(线性表的插入)。
。。。。。。
线性表的相关知识就补充这些,读者如果想了解更全面和严格的定义可以在网上搜或者参考各种数据结构的教材。

【限定操作】
我们接着来看 堆栈 ,堆栈的定义中还明确指出了“ 仅在表尾进行插入或删除 操作”。这意味着堆栈经过了更严格的“封装”,我们不能像线性表那样直接去提取其中任意条件,而是要遵守“表尾操作”的规则,这个规则叫做“先进后出”(FILO,First In Last Out)。

从字面上不难理解这个概念,相当于是把货物往仓库(栈)里堆压,值得一提的是这里的栈顶是表尾,栈底是表头,即这个线性表是“头朝下”的,由于可以通过malloc函数或者是声明数组的方式来构建栈,在表尾操作只需要每次往后加一个或者往前减一个,不会对整个表产生其它的影响。


3、栈的运作方式

栈最重要的操作是入栈出栈,当栈顶指在栈底的位置的时候栈为空。
栈的运作过程如下:


注释:从上往下从左往右是图一至图五,top为栈顶,bottom为栈底

图一:栈为空。top指向bottom所在位置。
图二:元素a入栈。a记入top所在的位置,top指向下一个元素位置。
图三:元素b、c入栈。同上,top向上(线性表中向后)两个位置。
图四:元素c出栈。出栈操作,top向下(线性表中向前)一个位置,此处c被删除,然而在实际操作中,通常省略删除操作,当下一次有元素入栈时直接将其覆盖。
图五:元素d、e、f入栈,top指向顶端(线性表表尾)。
我们可以清楚从图中发现,指针top总是在栈顶元素的上方。

4、使用堆栈的意义

由理论转向生产实践之前需要对理论的核心有深刻的了解,才能发挥出其最大价值。
对于堆栈,我们要看的就是它的“核心”——先进先出。先进先出的特性使得我们能很轻易得到输入当中最后的元素,同时整个表中的元素也是按照严格先后顺序没有插队的。
由此在数值转换(一直进行求余,余数需要顺序保存,逆序输出)、括号匹配(顺序等待不同优先级符号进入)、hanoi塔(递归求解)等问题的求解上就能派上很大用场。
在文章最后我想说的是,在再一次梳理数据结构相关知识的过程中,我领悟到:无论是学习还是生活都时刻处在解决问题的过程中,编程是解决问题的高效工具。针对问题选取恰当的数据结构,能把注意力更多放在问题本身。我想这个意义足够重大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值