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)
posted @ 2019-11-03 14:20  钱佳禹  阅读(191)  评论(0编辑  收藏  举报