数据结构第三章学习小结

一、内容小结:

第三章学习了栈和队列的有关知识,不仅学习了两种结构的定义、表示方法,并且在实现的过程中,也感受到了结构的应用的不同之处。开始形成了一种学习数据结构的步骤思维,也就是在新定义一种数据数据结构时,我们首先要考虑的是ADT,基于ADT的基本操作,进一步考虑每种操作如何实现,再根据实际问题考虑该结构需要使用的存储结构。

1.栈:

栈是后进先出的线性表,基于这个特点,我们在需要按照保存数据时相反的顺序来使用数据时,用栈来实现会十分方便。

除了初始化之外,入栈和出栈是栈的重要操作,顺序栈在实现入栈操作时,需要判断栈满,在实现出栈操作时则需要判断栈空,栈满和栈空都可以用定义的栈底指针及栈顶指针表示。链栈需要注意的是初始化时,栈顶指针要置空,否则为野指针,无法申请内存区域,乱指一气,这是应该养成的习惯。

关于栈还学习了用栈实现递归的一个应用,使用递归的优点是结构清晰易读,缺点是时间开销大,容易重复子问题,可能会增加时间复杂度。

2.队列:

   队列是先进先出的线性表,基础操作也包括初始化、入队、出队。

顺序队列会出现“假溢出”的问题,队列所用的存储区没有满,但队列却发生了溢出,对于这种情况,我们可以定义循环队列,通过取余将头尾连接,于是我们可以用:(Q.rear+1)MAX==Q.front判断队满,非常巧妙。

链队一般也要定义头结点,定义头结点可以保证处理不同个数数据时的操作都一致,入队在队尾操作,出队在队头操作。

二、      作业总结

1.括号匹配:

括号匹配是非常适合用栈实现的一个例子,一开始理解题目意思后没有认真整理思路,导致被不同的方法左右,再加上编写代码的能力不够,花费了大量时间模仿一个我其实并不理解的思路。之后在老师同学的帮助下才真正理解了如何用栈实现这个问题。

  首先可以定义字符串数组,并用cin.getline函数逐个读入数组,这样通过判断是否为读入的符号是否为\0就可以判断是否换行。当读到左括号时入栈,读到右括号时将栈内的符号出栈,就可判断是否与右括号匹配。最后通过判断在代码中标记的flag的值来判断匹配结果。

2.银行业务队列

   做这道题时先画了一个流程,有了大体思路后再写代码就轻松许多,虽然中间有很多步骤出错,但是参考资料后都解决了。该程序的数据就像排队,先排的人先走,因此很容易能想到用队列实现,题目中奇数与偶数需要被分到不同的位置,因此需要定义两个队列,将奇数和偶数分别按顺序分配到两个队列,再以输出两个奇数一个偶数的顺序实现程序。

   编写数字输出顺序这部分代码时,因为输出的首数字和末数字是不加空格的,于是想到了循环语句中输出的第一个数字应该直接输出,不加空格,但这导致了进行下一次循环时第一个数字依旧没有空格,和之前输出的第三个数字无法分隔,于是插入了一个flag,在运行完第一次循环的同时改变flag的值,并添加不是第一次循环时程序如何执行的代码。

 

  在做题时还是思路模糊,不清楚如何实现,总是一边写一边考虑下一部分应该做什么,所以之后做题时应该在纸上写下大致的流程,明确每一步要做什么以后再具体实现每一个步骤,具体步骤不懂的话再参考网上的代码或者同学的意见,同时还是要增强编程能力,做题之前好好读题很重要,不能心急随便浏览题目,发现自己不会后就求助,先给自己独立思考的空间,希望下一次编写代码时能高效一些,避免浪费时间,找到对的方法做题。

posted on 2019-03-31 16:43  King--  阅读(340)  评论(2编辑  收藏  举报

导航