首页 > 技术文章 > 20162309《程序设计与设计结构》第五周学习总结

Metwox 2017-10-14 17:58 原文

学号 20162309《程序设计与数据结构》第5周学习总结

教材学习内容总结

关于栈和数组以及链表的结合使用,包括使用链表和数组实现栈,和排序查找的巩固课上练习。同时开始对队列的学习,了解队列的基本操作规则,其中包括队列中的元素的进出规则(这里可以与栈进行比较),和队列的操作术语、操作细节。首先是关于栈的进阶学习,栈在定义上是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算,且栈中的元素进栈和出栈的规则与队列有很多不同的地方。栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。扩展内容:Java Collections API的基本结构:
1.collections比一般数组要好,例如,若要将数组的内容转储到一个字符串,需要迭代整个数组,然后将内容连接成一个 String;而 Collections 的实现都有一个可用的toString() 实现。
举一个代码的实例:
import java.util.*;

public class ArrayToList
{
public static void main(String[] args)
{
// This gives us nothing good
System.out.println(args);

    // Convert args to a List of String
    List<String> argList = Arrays.asList(args);
    
    // Print them out
    System.out.println(argList);
}

}
可以看出,在这里的返回的 List 是不可修改的,而且,由于 Arrays.asList() 使用 varargs 参数表示添加到 List 的元素,所以还可以使用它轻松地用以 new 新建的对象创建 List。同时可得Java Collections API 使这种转换变得容易。
2.迭代的效率较低:一个集合(特别是由数组转化而成的集合)的内容转移到另一个集合,或者从一个较大对象集合中移除一个较小对象集合,这些事情在程序设计和编译的过程中很常见。
在此情况下,迭代有很大的缺点:
(1)每次添加或移除元素后重新调整集合将非常低效。
(2 )每次在获取锁、执行操作和释放锁的过程中,都存在潜在的并发困境。
(3)当添加或移除元素时,存取集合的其他线程会引起竞争条件。
可以通过使用 addAll 或 removeAll,传入包含要对其添加或移除元素的集合作为参数,来避免所有这些问题。
3. 用 for 循环遍历任何 Iterable:Java 5 中加入 Java 语言的最大的便利功能之一,增强的 for 循环,消除了使用 Java 集合的最后一道障碍。
以前,开发人员必须手动获得一个 Iterator,使用 next() 获得 Iterator 指向的对象,并通过 hasNext() 检查是否还有更多可用对象。从 Java 5 开始,我们可以随意使用 for 循环的变种,它可以在幕后处理上述所有工作。
实际上,这个增强适用于实现 Iterable 接口的任何对象,而不仅仅是 Collections。
4.扩展 Collections API:Java Collections API 的一个最终观点:它总是适合加以扩展和修改,以满足开发人员的特定目的。
二、栈的应用:栈和线性表类似,也是有两种存储结构,分别为顺序结构和链式结构。大部分情况下,栈使用前者,这和它的使用场景有关,因为通常情况下我们不会对栈进行频繁地,随机地插入,删除操作。

5.关于结点:结点可以插入在链表的任意位置,当结点插入在链表的表头时,指向表头的引用指向新加的结点。链表中的各个引用会沿着表的结点移动到找到想要找到的结点,称为current,它表示正在被检查的当前结点。当current为第一个结点时,使用循环语句进行结点的寻找,找到后就可以插入新的结点,并开始下一轮的循环。

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

  • 问题1:关于双向链表:如何创建一个双向链表?
  • 问题1解决方案:链表由无数模块(struct)穿成一串组成,每个模块都有两个指针(双向链表),一个指向上一个模块,一个指向下一个模块,还有一些其他变量用来存储自己想要存储的内容。在网上查阅了一个关于双向链表结构以及运行的资料:
    //这里每一位=一个模块
    struct BIT
    {
    BIT* previousBit;//指向上一个结构体
    int theBit;//这一位数是什么
    BIT* nextBit;//指向下一个结构体
    };
    由一个类图进行具体化描述:

这样还有一个好处,就是当我们遍历链表的时候,一旦碰到NULL值之后,就知道这个链表已经结束了,不能再遍历下去了。这样我们就使用了 NULL 做我们的终止符。

  • ...

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

  • 问题1:在课上进行单步跟踪查找指定元素的实验中,所使用的输入语句为Integer,但当使用int输入时编译会出现错误。

  • 问题1解决方案:String类的数组可以使用int方法进行输入,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。进行比较:
    ①无论如何,Integer与new Integer不会相等。不会经历拆箱过程,i3的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,所以为false
      ②两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false
      java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存
      ③两个都是new出来的,都为false
      ④int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比

  • ...

代码托管

https://gitee.com/pdds2017/xty20162309-JavaFoundations2nd

结对及互评

本周与20162313苑洪铭同学共同学习关于链表使用和队列结构的知识,并共同进行了实验。

本周结对学习情况

- [结对同学学号1]https://home.cnblogs.com/u/yuanhongming/
- 结对照片
- 结对学习内容
    - 链表使用和结点使用
    -队列结构和队列工作规则
    - ...

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

java中有许多可以工具,可以和以前所学的内容进行结合,对以前学习的知识进行一个提升,同时在辨析两个相似的方法时要学会找到其中的不同点和相似处。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第四周 244/244 1/1 14/14
第五周 176/176 4/4 18/38
第六周 500/1000 3/7 22/60
第七周 300/1300 2/9 30/90
  • 计划学习时间:16小时

  • 实际学习时间:16小时

  • ...

推荐阅读