20182330《程序设计与设计结构》 第八周学习总结

20182330《程序设计与设计结构》 第八周学习总结

教材学习内容总结

周一:

  1. 链表实现栈
    data存放数据点
    next下一节点
    存储地址 数据域
    单链表:只含一个指针域的链表 a-》
    双向链表:<-a->
    地址不一定连续

  2. 尾插法
    Student temp = Head;
    while(temp.next!=null){
    temp=temp.next}
    temp.next=node;
    return head;
    用一个临时指针(不能影响头指针,头指针移动则垃圾回收)等于头指针temp=temp。next 若为null,找到了链表结尾,则指向新插入的对象

  3. 头插法:新对象指向首个元素,head指针赋给新对象,则新链表完成
    node.next=Head;
    Head =node;
    return Head;
    删除:

  4. temp.next=temp.next.next

  5. 两个指针,p.next=q.next
    循环链表
    双向链表
    栈与链表
    top即为head

周五:队列

  1. 队列:只能在队头删除,队尾插入。先进先出(队列等连续存储结构可以随机存取,链表不可以,必须从第一个开始找)
  2. 方法:enqueue入队
    dequeue出队
    first=peek看第一个元素
    isEmpty是否为空
    size多少元素
  3. 定义结点
    LinerNode
    LinerNode front //队头指针
    LinerNoderear // 队尾指针
    int count//元素个数
    演示https://visualgo.net/en/list
  4. 线性表
    具有相同特性数据元素的有限序列
    栈队列是特殊的线性表
  5. 出队入队操作:
    为空时rear front都在1(不是指针),为空判定条件:(rearfront)也有可能队满!
    (1) 少用一个空间,判断(rear+1)%M=front
    (2) size
    (3)看上一步操作,确定是front导致的还是rear导致的)
    入队rear+1,q[rear++]=x;
    出队front+1,e=q[front++];
    假溢出:0 1 2 3 4 5 浪费空间
    (出队元素)
    解决:
    (1)依次固定
    (2) mod size,循环队列:把队列设想成环形,让队列设想成环形,让sq【0】接在sq【M-1】之后,即:若rear+1
    M, 则另rear=0,移动指针不能用i=i+1,而是i=(i+1)%MAX
    入队 sq【rear】=e;
    rear=(rear+1)%M
    出队e=sq

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

  • 问题1:老师在课堂上演示的代码经常有泛型,那么究竟什么是泛型??如何使用?
  • 问题1解决方案:书本和网上解决。
  • 首先我们要知道:使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值。
  • 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?
  • 顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,
操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

用一个例子来说明:

List arrayList = new ArrayList();
arrayList.add("aaaa");
arrayList.add(100);

for(int i = 0; i< arrayList.size();i++){
    String item = (String)arrayList.get(i);
    Log.d("泛型测试","item = " + item);
}

毫无疑问,程序的运行结果会以崩溃结束:
ArrayList可以存放任意类型,例子中添加了一个String类型,添加了一个Integer类型,再使用时都以String的方式使用,因此程序崩溃了。为了解决类似这样的问题(在编译阶段就可以解决),泛型应运而生。

我们将第一行声明初始化list的代码更改一下,编译器会在编译阶段就能够帮我们发现类似这样的问题。

List<String> arrayList = new ArrayList<String>();
...
//arrayList.add(100); 在编译阶段,编译器就会报错
  • 问题2:“串行化”是什么意思
  • 问题2解决方案:串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件、内存缓冲区等)中或是以二进制方式通过网络传输。之后可以通过反串行化从这些连续的字节(byte)数据重新构建一个与原始对象状态相同的对象,因此在特定情况下也可以说是得到一个副本,但并不是所有情况都这样。
  • 暂时就只能看懂这么多。
  • 问题3:学习队列时偶然看到了“消息队列”的字眼,那什么是消息队列?
  • 问题3解决方案:“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。
    消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。

通俗的解释就是程序产生内容->入队(生产者) ->出队(消费者)

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

  • 问题1:头插法出错

  • 问题1解决方案:头插法在返回时一定要返回新的链表头,这样才能实现头插,否则就像我一样一直陷入死循环,检查代码无误,单步调试也无误,费了九牛二虎之力才找到问题的所在。

代码托管

前几周忘了截图,这是截止第十周之前的代码,以后会记得按时截图,以下统计代码量按照总增量/3计算。

上周考试错题总结

上周无考试

结对及互评

点评过的同学博客和代码

  • 本周结对学习情况

    • 20182314
    • 点评:知识点总结的较为详细,但是代码的问题理解不深。
      基于评分标准,我给本博客打分:14分。得分情况如下:
      感想,体会不假大空的加1分
      排版精美的加一分
      结对学习情况真实可信的加1分
      正确使用Markdown语法
      模板中的要素齐全(加1分)
      错题学习深入的加1分
      点评认真,能指出博客和代码中的问题的加1分
      教材学习中的问题和解决过程, 加5分
      代码调试中的问题和解决过程,加2分
  • 上周博客互评情况

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

学习内容加紧,在时间上很紧张,每天要熬夜才能完成各种学科的任务。希望能够调节好自己的时间,以最好的状态学习。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 10000行 30篇 400小时
第一周 42/42 2/2 20/20
第三周 394/471 2/4 25/45
第四周 394/471 2/4 25/45
第五周 1668/2139 2/6 35/80
第六周 2388/4527 1/7 30/110
第七周 1660 /6187 2/9 25/135
第八周 1660/7847 2/11 20/130
  • 计划学习时间:25小时

  • 实际学习时间:20小时

  • 改进情况:希望提高效率

参考资料

原文地址:https://www.cnblogs.com/weiii/p/11792857.html