20172308《Java软件结构与数据结构》第三周学习总结

教材学习内容总结

第 5 章 队列

  1. 队列:
  • 一种线性集合,其元素从一端加入,从另一端删除
  • 元素处理:FIFO
  1. 与栈的比较
  • 异:(1) 栈的处理过程只在栈的某一端进行;队列的处理过程在队列的两端进行。(2) 实现不一致
  • 同:与栈类似,队列中也没有操作能让用户抵达队列中部,同样也没有操作允许用户重组或删除多个元素(链表可以满足这类处理)
  1. 队列中的方法
  • 栈与队列的实现不一致:Java API提供的stack类实现了栈集合,却没有提供队列类,只提供了Queue接口,由多个类来实现
  • Queue接口提供:
    element方法:检索队列首部元素但不删除它
    add和offer方法:往队列中添加元素
    poll和remove方法:从队列中删除元素
  1. 栈的首要作用是颠倒顺序,队列的首要作用是保持顺序

  2. 链表实现队列
  • 实现关键:队列差别栈在于必须操作链表两端。所以需要指向链表首元素的引用和指向链表末元素的引用,还有跟踪队列元素数目的变量count
  • enqueue操作要求将新元素放到链表末端;
  • dequeue操作实现要确保至少存在一个可返回的元素
  1. 数组实现队列
  • 实现策略:将队列的某一端固定在数组的索引0处
  • 非环形数组实现的元素位移将产生O(n)的复杂度
    注:对于队列,用固定数组来实现栈的效率不高。
  • 把数组看成是环形的,可以除去在队列的数组实现中把元素位移的需要
  • 环形数组:并不是一种新的结构,只是数组的最后一个索引后面跟的是第一个索引,用来存储队列。
  1. 双端队列:队列的扩展,允许从队列的两端添加、删除和查看元素。

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

问题1:如何分析理解数组实现的队列中所需注意的问题?
问题1解析:

首先,数组实现的操作选择使得效率很低:因为用数组实现队列的策略是假定队列的首元素总是存储在数组的索引0处,而队列操作会修改集合的两端,则会要求移动元素,那么操作的复杂度为O(n);因此,用固定数组来实现队列效率不高
所以,为了除去元素移位的需要,可以引入环形数组

环形队列:内存上没有环形的结构,实际上是数组的线性空间来实现。
那么就存在一个问题:当数据达到了数组的尾部怎么办?如何判断达到了尾部?

  • 数据达到尾部了可以进行数组扩容操作以达到要求。
  • 判断队列为空,还是为满是环形队列的关键:当tail追上head时,队列为满时,当head追上tail时,队列为空。

【参考资料】环形队列实现原理

问题2:
问题2解析:

【参考资料】

代码运行中的问题及解决过程

问题1:

上周考试错题总结

  • 错题1:

  • 错题1解析:

  • 错题2:

  • 错题2解析:

  • 错题3:

  • 错题3解析:

  • 错题4:

  • 错题4解析:

代码托管

结对及互评

  • 博客中值得学习的或问题:
    • 侯泽洋同学的博客排版工整,界面很美观
    • 问题总结做得很全面
    • 对于书上的疑惑总会想办法解决它,这种探索的精神值得我去学习
  • 代码中值得学习的或问题:
    • 对于编程的编写总能找到角度去解决
  • 本周结对学习情况
    • 20172302
    • 结对学习内容
      • 第三章内容:集合概述——栈
      • 第四章内容:链式结构——栈

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 4/4
第二周 560/560 1/2 6/10

猜你喜欢

转载自www.cnblogs.com/zhouyajie/p/9699422.html
今日推荐