20162330 2017-2018-1《程序设计与数据结构》第六周学习总结


2017-2018-1 学习总结目录: 1 2 3 5 6 7 9 10 11 12



目录


  • 0. 教材学习内容总结
    • 0.1 队列ADT
    • 0.2 使用队列:编码k值
    • 0.3 使用队列:模拟票务柜台
    • 0.4 实现队列:使用链表
    • 0.5 队列的实现:使用数组


教材学习内容总结

第15章 队列

队列ADT

  • 队列在一端添加元素,在另一端删除元素。(最先进入的元素最先离开)
    【推论】队列是一个线性集合。

  • 队列的元素处理方式:FIFO(先进先出)

  • 在栈中,只在集合一端处理元素;在队列中,集合两端都有操作。

  • 重要术语:enqueue是指在队尾添加新元素;dequeue是指从对头删除元素;first操作检测对头的元素。

  • 其他方法在接口Queue的注释中已经写得很清楚了:

public interface Queue<T> {
    // Adds the specified element to the rear of the queue.
    public void enqueue(T element);

    // Removes and returns the element at the front of the queue.
    public T dequeue();

    // Returns a reference to the element at the front of the queue without removing it.
    public T first();

    // Returns true if the the queue contains no elements and false otherwise.
    public boolean isEmpty();

    // Returns the number of elements in the queue.
    public int size();

    // Returns a string representation of the queue.
    public String toString();
}
  • 在非空队列中,front始终指向队头元素,rear始终指向队尾元素的下一个位置。

使用队列:编码k值

  • Caesar 密码是一个简单的加密算法,但是它的加密方法非常容易被破解,移动位数固定造成加密的局限性。

  • 如果使用重复变化的k值,就可以改进Caesar 编码技术。自定义一个k值表,让每个字符移动的位数不同。这样一旦信息比k值长,就可以重新回到表头使用,既不容易被破解,又能适用于长信息的处理。

  • 新的加密方法对于相同的字符加密后得到不同的字符。

使用队列:模拟票务柜台

  • 常用队列表示等待的一列。

实现队列:使用链表

  • 便于找到指向链表中的第一个和最后一个元素的引用。

  • 入队操作:将当前最后一个元素的next引用指向新元素,并且rear引用重置为新的最后元素。

  • 出队操作:必须确保至少返回一个元素。

队列的实现:使用数组

  • 策略:将队列的一端固定在数组下标为0的地方。

  • 非循环数组实现队列时元素的移动得到O(n)阶复杂度。

  • 将数组看成一个环,可以避免移动元素。

  • 入队操作:(rear = rear + 1) % queue.length;

  • 出队操作:删除最大下标处的元素之后,front值必须置为0,其余情况出队front加1。

  • 循环队列:利用前端空闲空间存放新的队列元素 。

【返回目录】


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

  • 【问题】:栈与队列相比相同点有哪些?

  • 解决方案 :(查找相关资料)
    (1)之前分析过,栈在一端操作,而队列在两端操作,但是它们都是线性结构,数据元素具有“一对一”的逻辑关系;
    (2)插入操作都是限制在表尾进行;
    (3)都可以通过顺序存储结构(数组)和链式存储结构实现;
    (4)在时间复杂度上,插入与删除操作都需要常数时间;在空间复杂度上,情况也相同;
    (5)(扩充)多栈链和多栈队列的管理模式可以相同。在计算机系统软件中,经常会出现同时管理和使用两个以上栈或队列的情况,若采用顺序存储结构实现栈和队列,将会给处理带来极大的不便,因而一般采用多个单链表来实现多个栈或队列。

【返回目录】


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

  • 暂无

【返回目录】


代码托管

  • 本周代码上传 ch15 文件夹中,统计结果是第四五六周一共的代码,其中第六周写了260行代码:
    (statistics.sh脚本的运行结果截图)

上周考试错题总结

  • 还未给出解析。

【返回目录】


结对及互评

本周结对学习情况

  • 莫礼钟本周比第三周的状态好一点,虽然实验只完成了第一个和第五个,设计的方法比较简单,但是都是自己做的。在学习十四章的过程中,他已经基本掌握了如何使用数组实现栈,其中一些比较重要的方法(push、pop)我已经看着他写了一遍,希望多熟练已掌握的内容,并且再恢复一些学习状态,继续增加每周学习时间。

  • 20162319

    • 结对学习内容
      • 线性表
      • 用数组实现栈(push、pop方法的实现)

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

  本周算是比较忙的一周了,国庆之后的第一周并不轻松,除了运动会的一些杂事之外,本周的学习任务真心有点多。本周在课堂上我们又复习了查找与排序的内容,我的掌握情况还算过关,对于栈、队列这部分内容我选择“先听课再看书”的方式。到现在为止,栈的基本内容掌握了,队列的掌握情况还差很多,测试的成绩也不算高。本周我的状态有些下降,主要因为睡眠时间不足导致,下周我会将精力集中回来,并且平衡好完成团队任务和个人任务的时间。

  • 【附1】教材及考试题中涉及到的英语:

    Chinese English Chinese English
    队尾 rear 特征 characteristic
    出队 dequeue 可序列化的 serializable
    入队 enqueue 外部的 external
    增量 increment 制止 suppress
  • 【附2】本周小组博客

【返回目录】


学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 234/234 1/28 14/14 了解算法效率、大O符号等理论内容
第二周 255/489 1/29 12/26 了解敏捷的团队、泛型的使用
第三周 436/925 2/31 10/36 了解一些查找和排序的算法
第四周 977/1902 3/34 10/46 掌握实现线性结构
第五周 800/2702 2/36 12/58 掌握实现栈集合
第六周 260/2962 1/37 8/64 掌握实现队列集合
  • 计划学习时间:12小时

  • 实际学习时间:8小时

  • 有效学习时间:3小时

  • 改进情况:学习内容有所增加,本周我的效率极低,下周必须恢复到之前的状态,学习时务必心无旁骛。


参考资料

【返回目录】

posted @ 2017-10-15 23:56  N-Liu  阅读(330)  评论(1编辑  收藏  举报