前情回顾:在昨天,我们回顾了线性表的顺序存储结构和单链表结构,了解了它们存取数据、删除、插入操作算法的思路,还对比了它们的优缺点。
今天早上去面试了,表现还过得去,只是数据结构和算法方面的缺点暴露无遗。当面试官问到这方面的内容时,我就坦白自己这方面的薄弱,不坦白也没办法,会就是会,不会就是不会,假装不来。找借口也是不能的,还是得踏踏实实去学去实践,逃避更是不允许的。
不知道自己明天能不能收到二面的通知,童鞋们帮我祈祷一下吧。不管如何,博客还是要写下去的。
———————————————————————————闲聊结束——————————————————————————
第二章所讲的链表中,还包括循环链表和双向链表。循环链表,简单地说,就是头结点和终端结点连起来,即是终端结点的next指针指向头结点。而双向链表就是下一结点也有一个指针指向上一个结点,即是两个相邻结点间都有指针指向对方。下面,开始第三章,讲解另外两种数据结构。
第三章:栈与队列
第一节:栈的概念
栈(stack)是限定仅在表尾进行插入和删除操作的线性表。
我们把允许插入和删除的一段成为栈顶(top),另一端成为栈底(bottom),不含任何数据元素和栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
一般来说,栈的插入操作,叫做进栈,也称压栈、入栈;栈的删除操作,叫做出栈,也有的叫作弹栈。
说到这里,有必要提一道经常出的笔试题,是关于进栈出栈变化情况的。例如,3个整型元素1、2、3依次入栈,请问有哪些出栈顺序呢?答案是五种。一般来说,笔试题只会考选择题,问哪种情况是可能(不可能)出现的。这时候需要考虑各种情况。我在想,能不能写一个程序,输入正整数n,表示n个不同的元素依次入栈,输出y,表示y种出栈顺序呢?有空再试试。
第二节:栈的应用
1.递归
什么是递归呢?我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数。
下面看一段递归实现斐波那契数列的程序代码片段:
1 int Fbi(int n) 2 { 3 if(i==1)return 0; 4 if(i==2)return 1; 5 return Fbi(n-1)+Fbi(n-2); 6 }
顺便提一下递归和迭代的区别:迭代使用的是循环结构,递归使用的是选择结构。递归能使程序的结构更清晰明了,比较容易理解,但是大量的递归调用会建立函数的副本,会耗费大量的时间和内存。迭代则不需要反复调用函数和占用额外的内存。
那么递归是怎么用到栈的呢?递归过程退回的顺序是它前行顺序的逆序,在退回过程中,可能要执行某些动作,包括恢复在前行过程中存储起来的某些数据。编译器使用栈存储某些数据,并在后面又以存储的逆序恢复这些数据,以提供之后使用的需求,从而实现递归。
2.四则运算表达式求值
关键的两步:(1)将中缀表达式转化为后缀表达式(栈用来进出运算的符号)。
(2)将后缀表达式进行运算得出结果(栈用来进出运算的数字)。
具体的东西就不贴出来了,这几天试着写一个简单的四则运算计算器上传到CSDN_CODE或GitHub。(啊,多么伟大的尝试吖!)
第三节:队列的定义
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。
—————————————————————————中场休息————————————————————————————
写这一部分内容的时候有点燥,不是很能够静下心来写,也不知道该写些什么,我觉得还是需要敲写代码会比较好。
直接把资料上的代码贴出来没什么意义,等我这两天想好怎么写再说吧。不能再拖了。
下面还是不继续进行下去了,下面贴一篇我实习的时候写的日志吧,跟技术无关。
—————————————————————————休息结束————————————————————————————
逆行菩萨
菩萨有逆行的法门。凡是打击你、压迫你、刺激你、欺负侮辱你的人,使你爬不起来的人,都可能是逆行的菩萨。——佛家云
叶斯是我一个多年的好朋友,他比我大一岁,今年六月毕业,参加工作。他最近来大学城找我吃饭,聊天的时候提起工作一脸的不忿,说是考虑辞职不干换份工作了。我静静地听完他说完对自己的一丁点检讨以及对上司的大肆批判,说什么不把自己当人看,对自己毫无尊重。学自动化的他说在这家公司学不到东西,薪水也不高,留下来简直就是浪费生命。
饭后送他到地铁站的路上,我说:“我们来聊聊佛吧。”
“扯淡吧,就你这大色狼,无论哪方面都是无肉不欢,还有脸跟我说聊佛?!”他一脸鄙夷地说。
我老脸一红,故作镇定地说:“我不信教,但他们和尚念叨的一些东西还是挺有道理的。”
他说:“那你就讲讲看。我听着。”
一开始,我给他念了一开始我引用的那段话,告诉他什么是逆行菩萨。
他知道我在暗喻什么,说:“你是说,那个混蛋是我的逆行菩萨?”“混蛋”指的是他的上司。
“没错,他就是你的逆行菩萨。”我肯定地说,“佛家还说,‘不要认为刺激你的人是仇人,压迫你的人是冤家。因为坚强的意志力,往往是从磨链中培养出来的,我们的体能、智能、心力、毅力均要靠艰苦的经验来锻炼,不要因为逆境的挫折而灰心丧志。’”
“你的意思是说,他这样是为了我好咯?”他质疑道。
“他的主观意愿我不知道,也猜不透。不过对于你来说,你不要觉得上司说你几句,批评你一下你就把他想得那么罪不可赦,或许他对你要求严格一点对你也是好事。刚才你也说了,最近你在工作的时候的确也有松懈。”我说。
“但是他也不能对我说那样的话!”他反驳道。
“可是你换个角度想,光说你,如果你遇到每一个挫折和困难都把责任推到别人身上,然后一顿抱怨之后就逃避了事,你觉得会有改善状况的可能吗?”
他没有回答,但我能感觉到他的不服气。
“你刚才说要辞职,可是你有没有想过,换一份工作,你还是可能遇到这种情况——稍有松懈就被上司说被上司批评,到时候你还能继续像现在辞职?哪怕你每次都辞职,份份工作都做不长,你觉得是你的问题多一点,还是上司的问题多一点?”我接着说。
最后,到了入站的闸口前面,我停了下来,抓住他的胳膊,对他说:“像我这种脾气不好的人,我觉得凡事多忍耐是没错的。你也是一样,别随自己的脾气,被自己的不良情绪控制住。”
晚上,他给我发了封好长的电子邮件,说了很多很多的东西,最后说不辞职了,请假两天加上周末四天时间好好调整情绪再去好好上班。我回他说——
每一个看似刁难我们的人,可以是吃人恶鬼,也可以是逆行菩萨。
———————————————————————————第十六天——————————————————————————
今天的博客水分太大,自己都不好意思了。不发首页。
1.给自己规定的任务刚刚过半,终于迎来了倦怠期,一副懒洋洋的样子,灵感全无,又不想把资料上的内容直接贴出来。这样没自己的理解和总结,没效果,何必自欺欺人呢?
2.明天一定要好好想办法解决这个问题,争取尽快挺过这个倦怠期。
3.今天老妈打电话过来问我最近的情况,叮嘱我不实习了整天在学校要注意学习,不要成天想着玩。换作以前,我肯定会不高兴,觉得她为什么要这样怀疑我。现在嘛,不知道为什么,觉得很能体会到她对我的关心和担心,觉得她特别不容易。我得好好努力才行,等过几天再主动给她打电话,讲讲我最近的状态和做的事情,让她安心放心好好的。