第三章小结
第三章我们主要学习了栈和队列。经过第一次的写博客,与课后的学习与借鉴。我看到很多其他的同学在整理知识的时候采用了画大纲图,架构图的方法。不得不说,那样子确实比纯粹的文字更加简单明了。于是我决定也学习和效仿一下。
以下便是图解:
通过大图来看,很明显,和前面学习的顺序表,链表栈和队列的操作有同工异曲之妙。实际上围绕着栈和队列的也是分为两大分支,顺序表和链表。操作也是从初始化,插入,删除,查找几个操作入手。
当然,也有不同的地方,栈是典型的先进而后出,队列则是先进先出,其插入和删除的操作都是在头和尾进行操作的。
其中,在这一章的学习中,令我最印象深刻的是老师给我们讲的,针对于队列链表,是否需要头结点问题的讨论。对于是否需要,关键在于边缘问题的解决是否与非边缘问题一样。由此便需要进行对边缘化问题的分析与理解。在分析的过程,需要充分考虑许多的因素,很多细节都需要被注意到。
这一章节的作业题,括号匹配,一开始看到的时候我确实完全不知道如何入手。觉得这个问题用代码来解决实在没有多大的可能。上课的时候,发现书本也有关于这个问题的解答,很明显了就是要用栈来解决。当然,这时候我也还是没能够理解的很透彻。毕竟也只是一个初步的想法,知道了存储结构,要将想法实现还需要代码的构建。
真正给我启发的是班长在班群上发的一个图,里面简单地描述了这道题的算法。不得不说真的有被打通了任督二脉的感觉。
那个图里面是一个简单的匹配过程。存储在栈里面的都是左半边的括号。而遇到了有括号的时候则采取了出栈的措施,这时候再检查两者是否匹配即可了。当然最后要做的就是验证栈是否为空,为空即成功。
(以上三个图即为解题的思路与启发的图片)
然而事情并没有想象中的那么简单,在周一下课后我便开始改我的代码了。改了好几个钟,终于差不多了,可虽然没有语法错误,逻辑思维也对了,可运行出来的就不是正确的结果。无论输入什么,结果都是“no”。检查了一遍又一遍,还是查不出错误。直到第二天,上课问了老师之后,我才找到了问题的源头:
一开始,我缺少了 return false语句,因此如论如何,函数的返回值都是true,到最后也就无法判断出正确的结果了。
虽然过程有些曲折,但还好结果还是好的。通过这件事,我从中明白了:
写一个程序,说起来容易,实际上有许多的细节都是需要注意的。
①要有清晰的思路,明白自己主要要解决的是什么问题,关键是要解决什么问题。如此章的括号匹配问题,既要解决输入符号带空格这类小的问题,也要解决如何进行匹配的这类主干问题。有了思路再动手会更加流畅。
②关于程序总是调试错误的情况,其实可以通过插入一些输出的句子,来判断前面进行的操作是否正确。从而找到出问题的地方,也能够更好地对症下药了。
③细节往往决定成败,很多时候程序的运行不成功的原因都是因为一些细节。如我刚刚提到的漏掉了return false,或者说判断两边等于的时候采用了“=”赋值号。这些都是细小的错误,然而也都是致命的错误。因此关注细节很重要。
在这章的学习中,我参考了这些网站的资料,我觉得总结的挺好,值得我们去借鉴。
https://www.cnblogs.com/luolizhi/p/5746775.html C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
https://www.cnblogs.com/hughdong/p/6841337.html 数据结构 | 链表队列(基本操作及图示)
https://www.cnblogs.com/biglucky/p/4651254.html 用链表实现队列的功能
经过了一个月,我感觉得到打代码的感觉慢慢回来了。但现在还是存在一些问题,我想要课余时间做一些有趣的代码。例如我寒假模仿写了一个推箱子的小游戏。因此目前要解决一些问题。找更多的时间去写一些有趣的代码。既提升自己对写代码的兴趣,又可以多动脑,多动手,多思考。
上次的目标是在课余时间更加自主地学习,我觉得我完成还比较可以。在遇到问题时,能够比较冷静面对,独自思考,参考一些有价值的资料。接下来的目标,我希望在下一次的小结前我进行模仿可以弄出来一个贪吃蛇的小游戏,又或者是别的的小游戏,或者是一些比较有趣的代码吧。
原文地址:https://www.cnblogs.com/ilikezero/p/10625388.html