20172327 2018-2019-1 《程序设计与数据结构》第四周学习总结

时间:2023-02-21 14:34:20

20172327 2018-2019-1 《程序设计与数据结构》第四周学习总结

教材学习内容总结

第六章 列表

列表集合


1.链表和列表对比:链表是一种实现策略,使用引用来在对象之间创建链接。列表集合是一种概念性表示法,列表可以由链表和数组来实现。

2.栈和队列都是线性结构,其元素只能在末端添加和删除。列表集合更一般化,可以在列表的中间和末端添加和删除元素。

3.列表集合分为3种类型:
有序列表(ordered list):其元素按照元素的某种内在特性进行排序。
无序列表(unordered list):其元素间不具有内在顺序,元素按照它们在列表中的位置进行排序。
索引列表(indexed list):其元素可以用数字索引来引用。

Java API 中的列表


1.Java集合API中提供的列表主要是支持索引列表。

2.Java API没有任何类能直接实现以上描述的有序列表。

3.Arraylist和Linkedlist都实现了java.util.List接口。

方法 描述
add(E element) 往列表的末端添加一个元素
add(int index,E element) 往指定索引处插入一个元素
get(int index) 返回指定索引处的元素
remove(int index) 删除指定索引处的元素
remove(E Object) 删除指定对象的第一个出现
set(int index,E element) 替代指定索引处的元素
size() 返回列表中的元素数量

列表ADT


1.很多常见操作可以为所有类型的列表定义,这些操作之间的差别在于如何添加元素。

2.

操作 描述
removeFirst 在列表中删除第一个元素
removeLast 在列表中删除最后一个元素
remove 在列表中删除某个元素
first 查看位于列表前端的元素
last 查看位于列表末端的元素
contains 确定列表是否含有某个元素
isEmpty 确定列表是否为空
size 确定列表中的元素数量


3.有序列表在添加元素时,只需要用add,位置取决于其键值。无序列表add操作有三种变体:addToFront(元素添加到列表前端)addToRear(元素添加到列表末端)addAfter(把元素添加到某个已知元素后边)

教材学习中的问题和解决过程

  • 问题1:为什么用数组实现列表时没有用环形数组,与用数组实现队列时有何区别?
  • 问题解决分析:、对于非环形数组数组实现队列假定队列的首元素总是存储在数组的索引0处,由于队列处理会影响该集合的两端,因此在删除元素时,该策略要求移动元素,使得dequeue操作的复杂度为O(n),数组实现的操作选使得效率低,而把数组看做环形的,可以去除在队列的数组实现中把元素位移的需要。而对于使用数组实现列表,一般的列表也可以从两端添加和删除元素,但是它们还有从列表中间插入或删除元素,因此无法避免要移动元素,也可以使用环形数组方法,但是当从列表中间插入或者删除元素,仍然需要移动元素,因而使用环形数组就显得没有必要了

代码调试中的问题和解决过程

  • 问题1:在实现ArrayOrderedListTest测试时,我遇到了显示最后一个数字时,人家显示为null这个问题。
    20172327 2018-2019-1 《程序设计与数据结构》第四周学习总结

  • 解决分析,在我对前面ArrayList类检查时,发现我在显示last时,将rear-1不小心写成rear了,所以它所读取的是最后一个后边的,所以肯定为空。

上周考错题总结

  • 错题1:A polymorphic reference uses _______________, not the type of the reference, to determine which version of a method to invoke.
    A .the type of the object

B .the type of the reference
C .both A and B

D .none of the above
解析:多态引用不能使用参考的类型来确定要调用的方法的版本。

  • 错题2:A reference variable can refer to any object created from any class related to it by inheritance.
    A .true

B .false

解析:一个引用变量可以指向创建自任何与其具有继承相关性的类的任一对象。

  • 错题3:Common features should be located as low in a class hierarchy as is reasonable, minimizing maintenance efforts.
    A .true

    B .false

解析:共同特征应该在合理的条件下尽可能高的至于该层次结构中,以最小化维护工作。

  • 错题4:The most efficient way to implement an array-based stack keeps the top of the stack at the position 0 of the array?
    A .true

    B .false

解析:出于运行效率的考虑,基于数组的栈实现总是使栈底位于数组的索引0处。

  • 错题5:The implementation of the collection operations should affect the way users interact with the collection.
    A .true

    B .false

解析:集合操作的实现细节不应该影响使用者与集合进行交互的方式

  • 错题6:In an array implementation of a Stack, the array is ___________ causing the implementation to have to create a new larger array and copy the contents of the stack into the new array in order to expand the capacity of the stack.
    A .Dynamic
    B .Static

    C .Flexible
    D .Polymorphic

    正确答案: B 我的答案: D
    解析:对数组的理解不透彻。

  • 错题7:By using the interface name as a return type, the interface doesn’t commit the method to the use of any particular class that implements a stack.
    A .true

    B .false

    正确答案: A 我的答案: B
    解析:书中有相似的话,理解有误。

  • 错题8:A data structure that uses object reference variables to create links between objects is
    A .Linked Structure

    B .Pointer

C .Self-referential
D .Array
正确答案: A 我的答案: B
解析:没有看清题目,没有看清数据结构几个字,选成了指针。

  • 错题9:A linked implementation of a stack adds and removes elements from the _______ of the linked list.
    A .Front

    B .Rear
    C .Middle
    D .None of the above

    正确答案: A 我的答案: D
    解析:应该是头删,尾进,题目模糊。

  • 错题10:The first operation removes an element at the front of the queue and returns a reference to it.
    A .True

B .False

正确答案: B 我的答案: A
解析:因为删除操作会移动指针,但是不会返回。

  • 错题11:Which of the following operations of a queue examines the element at the front of the queue?
    A .Enqueue
    B .isEmpty

    C .size
    D .first

    解析:isEmpty检查是否为空,first输出最前面的元素。

代码托管

结对及互评

正确使用Markdown语法(加1分)
模板中的要素齐全(加1分)
教材学习中的问题和解决过程, (加3分)
代码调试中的问题和解决过程, 无问题
感想,体会真切的(加1分)
点评认真,能指出博客和代码中的问题的(加1分)

  • 20172317
    基于评分标准,我给以上博客打分:4分。
  • 20172320
    基于评分标准,我给以上博客打分:8分。

    • 结对学习内容
      • 教材第6章
      • 完成课后自测题,并参考答案学习
      • 完成课后练习题
      • 完成程序设计项目:至少完成PP6.8、PP6.11、PP6.17

其他(感悟、思考等,可选)

国庆期间学的这一章,本来因该有很多时间,但因为没有把握和控制,所以用在学习上的时间并不多,感觉这章我依然学不懂,很纠结,还在补前面的,希望下章会变好点。对于结对编程嘛,我也没办法,我感觉我们三个从来不商量,各学各的,每次让我给他们打分,我觉得这对我来说就是完完全全的形式主义,走走流程罢了。目前我遇到的问题,我都会去问其他同学,我觉得结对编程在我这没有实际意义,既然博客要保留,我还会继续更新,但我对于这方面,不会加以修改。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 8/8
第二周 1306/1306 1/2 20/28
第三周 1291/2597 1/3 18/46
第四周 4361/6958 2/3 20/66

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:10小时

  • 实际学习时间:8小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料