20182320《程序设计与数据结构》第七周学习总结

20182320《程序设计与数据结构》第七周学习总结

教材学习内容总结

1. 第十二章:算法分析

1.1 算法:

我认为是计算机完成一个任务所使用的计算方法。

1.2 算法效率:

我认为是在一定时间内,运用某算法来执行某任务的资源于时间的比值。

1.3 增长函数

增长函数表示了问题大小(n)与希望优化的值之间的关系。例如,洗碟子时,洗碟子的数量(n)和所用时间(t)的关系,"t=k*n"。

1.4 渐进复杂度(时间/空间复杂度)

又称为算法的阶,符号计为O(),它和增长函数有关,具体由例子解释:

注意:若计算一个算法的阶,其中涉及函数调用时,要把函数里面的调用也算上。

2. 第十四章:栈

2.1 什么是栈?

栈是一种数据结构,特点和电梯相似,元素从顶部压入栈中,先进去的元素后出来,后进去的元素先出来。

2.2 栈需具备的基本方法

#### 2.3 泛性 泛性,顾名思义,宽泛的类型。可用于声明,但不能实例化。需要在实例化的时候指定泛性引用变量的变量类型。 #### 2.4 后缀表达式 顾名思义,就是运算符放在数字后面的表达式。以下面为例: ![](https://img2018.cnblogs.com/blog/1779749/201911/1779749-20191101225433368-1491848476.png)

用代码实现计算后缀表达式的思路如下:

将表达式字符串用StringTokenizer分隔,单独提取,若提出来的是数字,则压入一个栈中,若是运算符,则从数字栈中弹出两个数字,用这个运算符进行计算,结果再次压入栈中。

例如:
!

2.5 实现栈的数据结构的编程方法

(1)用链表实现
(2)用数组实现

3. 第十五章:队列

3.1 什么是队列?

队列也是一种数据结构,结构特点也能从它的命名看出,就和我们日常排队差不多,元素一个接一个往后排,轮到某个元素出队的时候就从最前面出,如下图:
!

3.2 队列需具备的基本方法

3.3 实现队列的编程方法

(1)用链表实现
(2)用数组实现

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

  • 问题1:泛型T和Object类型的区别?
  • 问题1解决方案:

在网上查找:
!

总的来说,Object是一个可以实例化的变量,它无论是先声明,还是先实例化,在后面都要进行强制转换才能赋给别的数据类型变量。

而T泛性则是在实例化之前就要给出确定的数据类型,所以不涉及强制转换。

  • 问题2:链表和数组的优缺点?
  • 问题2解决方案:

数组比链表好在:能根据下标随机读取,链表要访问一个结点需要一个个摸过去;

链表比数组好在:链表比数组节省空间,而且在面对多次循环,元素数量不确定时,链表能比数组更方便地开空间。

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

  • 问题1:

在做PP14.7将前缀表达式转换成后缀表达式的时候,我想的过于复杂,甚至考虑到了运算符的优先级,但其实并没有那么麻烦。

  • 问题1解决方案:

只需要运用两个栈,每个都是存放字符串型的变量。一个放整个表达式的所有元素,即数字、字符全放进去,随后开始pop,pop出数字就压入另一个栈,pop出运算符就在从另一个栈中pop出两个数字进行字符串连接,再放回放数字的栈。如此循环,不需要涉及字符串到字符型、整型的转换,也不涉及运算符优先级,就能实现前缀转后缀。

  • 问题2:

在做查找及ADL作业中,在我编写用链地址法解决散列排序的冲突时,我的设置的指针始终都指向冲突点中的第一个位置,即由元素存放的位置,陷入死循环。

  • 问题2解决方案:

后来发现我犯了一个逻辑性错误:

for(a!=null){
    a=a.getNext();
}
a=new LinearNode();

在上面的代码中,a到最后总会指向null,而无法像我想象的那样为a的前一个结点赋上下一个指针的值。

[代码托管]

https://gitee.com/zheng_liyuan/Leon/tree/master/ArrayStack/javafoundations
https://gitee.com/zheng_liyuan/Leon/tree/master/Latter_Post
https://gitee.com/zheng_liyuan/Leon/tree/master/LinkedQueue/code
https://gitee.com/zheng_liyuan/Leon/tree/master/Queue

结对及互评

点评过的同学博客和代码

  • 本周结对学习情况
    • 20182307
    • 结对学习内容
      • 线性查找
      • 散列插入
      • 散列查找
      • 二叉树
      • 链表的插入、删除、弹出
      • 队列的插入、删除、出队
  • 上周博客互评情况

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

首先,这周学习压力较前几周更大,花了很多时间来做实验、敲代码。时间花费过多,我认为主要原因有以下:

(1)编程逻辑不够严谨,在编程量大的时候,经常会频繁出现空指针异常的报错。
(2)程序条理不够清晰,虽然有简单的注释,但是还没能做到按照功能分块,往往贪图操作便捷,导致最后自己都看不懂自己的程序。

其次,单步调试真是个好东西,虽然有点复杂,但是还是能有效排查程序中的错误。

第三,安卓的所有布局中,原始布局最容易上手,可以随心所欲摆放组件位置。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 10000行 30篇 400小时
第一周 208/208 2/2 9/9
第二周 258/466 2/4 15/24
第三周 693/1159 2/6 22/46
第四周 1383/2542 2/8 30/76
第五周 1300/3842 2/10 22/98
第六周 1998/5840 2/12 24/122
posted @ 2019-11-02 16:08  郑力元  阅读(171)  评论(0编辑  收藏  举报