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

博主是某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塔(递归求解)等问题的求解上就能派上很大用场。
在文章最后我想说的是,在再一次梳理数据结构相关知识的过程中,我领悟到:无论是学习还是生活都时刻处在解决问题的过程中,编程是解决问题的高效工具。针对问题选取恰当的数据结构,能把注意力更多放在问题本身。我想这个意义足够重大。

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

  1. Python数据结构学习笔记——栈

    目录 一.栈的定义和特性 (一)栈的定义 (二)栈的反转特性 二.实现分析步骤 三.栈的Python实现代码 四.栈的应用 (一)匹配圆括号 (二)匹配符号 (三)模2除法(十进制转二进制) (四)进 ...

  2. 数据结构学习笔记——栈和队列

    4 栈与队列   栈是限定仅在表尾进行插入和删除操作的线性表.队列是只允许在一端进行插入操作.而在另一端进行删除操作的线性表. 4.1 栈的定义 栈(stack)是限定仅在表尾进行插入和删除操作的线性 ...

  3. 数据结构学习笔记——栈的基本知识和顺序存储结构实现栈(顺序栈)

    目录 一.栈 (一)栈的概念 (二)栈的排列 (三)共享栈 (四)栈的常见应用 二.顺序栈的定义 三.顺序栈的初始化 四.判断顺序栈是否为空栈 五.判断顺序栈是否为满栈 六.进栈(插入操作) 七.出栈 ...

  4. 408数据结构学习笔记——栈和队列的应用、特殊矩阵的压缩

    目录 1.栈在括号匹配中的应用​ 2.栈在表达式求值中的运用 2.1.中缀表达式转换后缀表达式 2.2.后缀表达式的计算方法 2.3.中缀表达式转换前缀表达式 2.4. 中缀表达式转后缀表达式(机算- ...

  5. Python数据结构学习笔记——队列和双端队列

    目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...

  6. 数据结构 - 学习笔记 - 红黑树

    数据结构 - 学习笔记 - 红黑树 定义 简介 知识点 1. 结点属性 2. 前驱.后继 3. 旋转 查找 插入 父结点为黑色 父结点为红色 1. 有4种情形只需要变色(对应234树4结点) 1.1. ...

  7. 数据结构学习笔记:利用栈实现进制转换

    数据结构学习笔记:利用栈实现进制转换 一.除基倒取余法示意图 二.编写十进制转换成二进制Python程序 1.源代码 2.运行结果 其实Python提供了一

  8. 数据结构学习笔记:利用Python列表实现栈结构

    数据结构学习笔记:利用Python列表实现栈结构 利用Python列表实现栈结构.有两种实现方式: 1.将列表的末尾(rear)作为栈顶(top) 2.将列表的前端(front)作为栈顶(top) 一 ...

  9. 数据结构学习笔记(七):哈希表(Hash Table)

    目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...

最新文章

  1. 刀片服务器与机架服务器对比
  2. 使用DispatchAction类,为你的系统减肥!
  3. python入门:常用模块—random模块
  4. PHP CLI模式开发
  5. mvc 404错误 php,ASP.NET MVC实现404跳转的代码实例
  6. 下面使用计算机动画制作的,华师17年3月课程考试《计算机动画制作》作业考核试题...
  7. 搜索引擎索引之如何建立索引
  8. 通过福禄克测试仪进行数据中心机房各个区域的测试或认证
  9. String类得常用方法
  10. Python--MySql学习(10.30)
  11. java eml解析_javamail 收邮件 解析eml文件
  12. python有道-Python爬去有道翻译
  13. 深圳卫视 - 饭没了秀
  14. 【Transfer Learning】泛化到未知域:域泛化 (Domain Generalization) 综述论文
  15. 计算机快捷键屏幕录制,电脑录屏快捷键是哪个(电脑录屏的方法有4种)
  16. jquery audio在微信或者客户端需要点击两次才能正常播放的问题解决方案
  17. GitLab使用教程(详细)
  18. ssm框架的简要介绍
  19. 安装IBM HTTP SERVER
  20. windows 注册表固定桌面壁纸

热门文章

  1. 软件系统的多维性能模型
  2. 破解APK并修改APK的包名
  3. 深度学习与自然语言处理教程(8) - NLP中的卷积神经网络(NLP通关指南·完结)
  4. 不用群发,就可以查看你被哪些微信好友删除了
  5. android程序怎么执行,电脑怎么运行安卓手机程序【详细介绍】
  6. html文本框监听粘贴,HTML5将粘贴板上的图片粘贴到文本框中
  7. 2020-08-29 ---- 美团点评 笔试
  8. 苹果蓝牙耳机平替哪款最好?四款苹果蓝牙耳机平价替代
  9. 某星级酒店警卫队定岗定编项目纪实 ——完善定岗定编,转向人性化管理
  10. Dev中的GridControl中根据条件显示背景色