20182333 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结
20182333 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结
教材学习内容总结
第十二章 算法分析
- 1.算法效率(决定着一个程序执行的速度)
- 2.增长函数与大O符号。增长函数表明问题大小(n)与希望优化的值之间的关系。该函数表示时间复杂度或空间复杂度。渐进复杂度称为算法的阶。记为O(n)
第十四章 栈
- 1.集合分为两大类:①线性集合:按照顺序一个一个排。②非线性集合:存在顺序并列的情况。
- 2.栈是一种线性集合,元素按后进先出(LIFO)的方法进行处理,有push,pop,peek,isempty,size等常用操作
- 3.栈是用于计算后缀表达式的理想数据结构,在进行运算时,先把中缀表达式转为后缀表达式,然后从左到右扫描,数字入栈,遇见符号,把前两个数字进行相应的运算然后放入栈中(减法是第二个数减去栈顶的数)。
- 4.链式结构是基于数组的集合实现的主要代替方案,链表是一种链式结构,自引用式构成了链表的基础,在链表中存储的对象通常泛称为结点node
- 5.链表会按需动态增长,因此本质上,它没有容量限制
- 6.使用链表实现的栈和使用数组实现的栈一样,都需要写出相应的push、pop等方法。
第十五章 队列
- 1.队列是一种线性集合,元素从一段加入从另一端删除(先进先出)。
- 2.队尾(tail),队首(head),队列前端(front),队列末端(rear)。
- 3.通过链表和数组实现队列。
- 4.队列需具备的基本方法
教材学习中的问题和解决过程
- 问题1:哑结点是什么,有什么作用?
- 问题1解决方案:哑结点其实就是放在第一个存放数据结点之前、头结点之后的结点。加入哑结点之后就会方便执行链表的一些操作。
- 问题2:LinkedStack类与ArrayStack类的对比。
- 问题2解决方案:stack的实现分为两种,一种是使用数组来模拟栈,另外一种是使用链表来模拟栈,ArrayStack使用数组来实现,LinkedStack使用链表来实现。
- 问题3:Queue接口两种方法add和offer在异常类处理上有何不同。
- 问题3解决方案:区别:两者都是往队列尾部插入元素,不同的时候,当超出队列界限的时候,add()方法是抛出异常让你处理,而offer()方法是直接返回false
- 问题4:为什么用数组实现队列时,环形数组较好?
- 问题4解决方案:环形队列可以解决数组移动的缺点,当尾指针超出数组末尾时,尾指针移动数组头部。这就将数组虚拟成了一个环形,只要队列长度没达到最大值,就可以插入,而不用移动数组。
- 问题5:链表和数组的异同点
- 问题5解决方案:数组能根据下标随机读取,链表要访问一个结点需要一个个摸过去;链表比数组节省空间,而且在面对多次循环,元素数量不确定时,链表能比数组更方便地开空间。
代码调试中的问题和解决过程
- 问题1:ArrayStack类核心方法的实现(用数组实现栈)
- 问题1解决方案:
压栈方法push
public void push (T element){
if(count == stack.length)
expandCapacity();
stack[count] = element;
count ++;
}
private void expandCapacity(){
T[]larger = (T[])(new Object[stack.length*2]);
for(int index=0;index<stack.length;index++)
larger[index] = stack[index];
stack = larger;
}
出栈方法pop()
public T pop() throws Exception
{
if (count==0)
throw new Exception("PopExpection");
else
count--;
T math = stack[count];
stack[count] = null;
return math;
}
peek()方法
public T peek() throws Exception
{
if (count==0)
throw new Exception("PeekExpection");
else
return stack[count-1];
}
- 问题2:用泛型定义的数组在实例化时出现问题。
public ArrayStack() {
top = 0;
stack = (new T[capacity]);
}
- 问题2解决方案:在整个实例化之前加T[]就可以使数组实例化。
public ArrayStack() {
top = 0;
stack = ( T[]) (new Object[capacity]);
}
## [代码托管](https://gitee.com/besti1823/20182333qjy/tree/master/src/KeHouTi/week7)
![](https://img2018.cnblogs.com/blog/1779650/201911/1779650-20191103141810972-103187182.png)
## 上周考试错题总结
上周没有考试,所以没有错题。
### 点评过的同学博客和代码
- 本周结对学习情况
- [20182317](https://www.cnblogs.com/pytznb/)
- [20182318](https://www.cnblogs.com/1400694592qq/)
- 结对学习内容
- 对一些程序渐进复杂度的计算
- 对栈的一些讨论和学习。包括出栈,入栈,删除等等
- 对队列的一些讨论和学习。包括链表和数组实现队列,入队、出队等等
- 上周博客互评情况
- [20182317](https://www.cnblogs.com/pytznb/)
- [20182318](https://www.cnblogs.com/1400694592qq/)
## 其他(感悟、思考等,可选)
- 这周学习了三章的内容,学会了很多的东西,包括程序复杂度的计算,栈和队列的实现以及在Android上实现一些栈和队列的操作。
- 感觉后期的任务量有点太重了,毕竟越到后面代码难度也越来越大了,但是任务量却是也上来了,有点扛不住了。
## 学习进度条
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
| -------- | :----------------:|:----------------:|:---------------: |:-----:|
| 目标 | 10000行 | 30篇 | 400小时 | |
| 第一周 | 56/56 | 2/2 | 20/20 | 主要学会了简单的操作Linux以及如何编写简单的java程序并将它上传到码云 |
| 第二、三周 | 331/407 | 3/5 | 23/43 | 学会了一些类和程序包的使用,也明白了C语言和Java在有些地方的区别 |
| 第四周 | 595/1002 | 2/7 | 20/60 | 学会了IDEA以及用IDEAgit码云,也学会了TDD测试 |
| 第五周 | 1621/2623 | 2/9 | 17/77 | 见识了服务器与用户链接的代码,也学习了继承的一些知识。|
| 第六周 | 1770/4393 | 1/10 | 22/99 | 学习了多态以及与接口和继承的关系,还有就是对异常的学习和处理异常的方法以及自定义一个异常|
| 第七周 | 1747/6140 | 3/13 | 23/122 | 学习了渐进复杂度的计算,栈和队列的学习,分别用数组和链表实现队列|
- 计划学习时间:20小时
- 实际学习时间:23小时
- 改进情况:代码已过6000,初步完成了不挂科的指标。
## 参考资料
- [《Java程序设计与数据结构教程(第二版)》](https://book.douban.com/subject/26851579/)
- [《Java程序设计与数据结构教程(第二版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)