20172321 2018-2019-1 《程序设计与数据结构》第二周学习总结
教材学习内容总结
第三章:集合概述-栈
-
3.1集合
- 集合是一种隐藏了实现细节的抽象。
- 集合可以分为两大类:包括线性集合和非线性集合。
- 抽象:抽象能隐藏某些细节,就例如书上的例子,汽车的方向盘等控制装置就是一种抽象,让我们不用关心底层细节就能控制整个操作过程。
- 抽象数据类型:一个抽象数据类型(ADT)是由数据和在该数据上所实施的操作构成的集合,一个ADT有名称、值域和一组允许执行的操作。
- 数据结构是一种用于实现集合的编程结构集。我们可以利用线性数据结构来实现非线性集合。
-
3.2栈集合
- 栈(stack)是一种线性集合,其元素添加和删除都在同一端进行。
- 栈的元素是按照后进先出(LIFO)(即 Last in ,first out)的方法进行处理的,最后进入栈中的元素最先被移出。
- 栈的一个本性——所有操作都是在一端进行的,因此,在中间或者底部删除、增添就很困难。(如果需要访问集合中间或者底部的元素,那么不适合栈作为数据结构)
- 栈的一些操作
操作 描述 push 添加一个元素到栈的顶部 pop 从栈的顶部移出一个元素 peek 查看栈顶部的元素 isempty 确定栈是否为空 size 确定栈的元素数目 -
3.3主要的面向对象的概念
- 多态引用是一个引用变量,他可以在不同地点引用不- 同类型的对象。术语“多态性”可定义为“具有多种形式”。通过多态引用调用的某个方法,在每次调用的时候都可以发生变化。
- 继承可用于创建一个类层次,一个引用变量可用于指向与之相关的任意对象。继承就是从已有类派生出一个新类的过程。新类自动地含有初始类的部分和全部变量和方法。
- 泛型(generic type):一个集合所管理的对象的类型要在实例化该集合对象时才确定。泛型保证了集合中对象类型的兼容性。
-
3.5异常
- 异常(exception)就是一种对象,它定义了一种非正常或错误的情况。异常有程序或运行时环境抛出,可以按预期的被捕获或被正确处理。
-
3.6栈ADT
- 栈接口类中的各个方法
public interface Stack<T>
{
public void push (T element);
public T pop();
public T peek();
public boolean isEmpty();
public int size();
public String toString();
}
- 3.8ArrayStack类
- 泛型(包括泛型数组)不能被实例化。这就是我们必须创建一个存储Object引用的数组,然后把他转换成泛型数组的原因。
stack = (T[])(new Object[initialCapiry])
第四章:链式结构——栈
- 4.1链接做引用
- 对象引用变量可以用来创建链式结构,链式结构是一种数据结构
-对象引用变量存放的是对象的地址,表示对象在内存中的存储位置
-在链表中存储的对象通常泛称为该链表的结点,注:需要一个单独的引用变量来表示链表的首结点,链表终止于其next引用为空的结点
- 对象引用变量可以用来创建链式结构,链式结构是一种数据结构
- 4.2管理链表
- 改变引用顺序是维护链表的关键
- 处理链表的首结点需要进行一些特殊的处理,我的理解是,如果处理首结点时没有注意front引用,就可能导致整条链表的丢失。
- 4.5使用栈来穿越迷宫
- 可以用栈来模拟递归处理,以跟踪恰当的数据
- 4.6用链表实现栈
- 这一章用链表实现栈LinkedStack和上一章用数组实现栈ArrayStack联系很大,各有优劣,学习的时候应该举一反三,相互思考。
教材学习中的问题和解决过程
- 问题1:不能明白泛型到底是什么,可以怎么使用
- 解答:泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。;泛型的参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。虽然还是有点懵逼,
但是约莫大概也许是明白了一部分。
代码调试中的问题和解决过程
- 在编写完pp3.2并且运行的时候,发现了一个诡异的错误,就是它只会把最后一个入栈的字符弹出,后面的全是null。
- 最后经过调试,发现是写栈的时候出了一点问题,指针没有正确的移动。
代码托管
PP3.9的代码没法上传到马云,在这里贴出来
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Stack;
public class MainActivity extends AppCompatActivity {
Stack<String> stack = new Stack();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new myButtonOnClickListener1());
Button button2 = (Button)findViewById(R.id.button2);
button2.setOnClickListener(new myButtonOnClickListener2());
}
public class myButtonOnClickListener1 implements View.OnClickListener{
public void onClick(View view){
EditText editText1 = (EditText)findViewById(R.id.editText1);
stack.push(editText1.getText().toString());
EditText editText2 = (EditText)findViewById(R.id.editText2);
editText2.setMovementMethod(ScrollingMovementMethod.getInstance());
editText2.setText(editText2.getText(),TextView.BufferType.EDITABLE);
editText2.setText(stack.toString(), TextView.BufferType.EDITABLE );
System.out.println(editText2.getText().toString());
}
}
public class myButtonOnClickListener2 implements View.OnClickListener{
public void onClick(View view){
EditText editText1 = (EditText)findViewById(R.id.editText1);
stack.pop();
EditText editText2 = (EditText)findViewById(R.id.editText2);
editText2.setMovementMethod(ScrollingMovementMethod.getInstance());
editText2.setSelection(editText2.getText().length(),editText2.getText().length());
editText2.setText(stack.toString(),TextView.BufferType.EDITABLE);
System.out.println(editText2.getText().toString());
}
}
上周考试错题总结
-
1.Which Growth function has the highest order?
- A .O(n log n)
- B .O(n2)
- C .O(2n)
- D .O(log n)
- 正确答案: C 你的答案: B
-
解析:c(常量)<㏒₂n < n < n㏒₂n < n²< n³ < 2ⁿ < 3ⁿ< n!很明显,这道题如果把B当作n^2就会选B了。
-
2.Which of the following has the smallest time complexity?
- A .3n+5+2n
- B .logn+2
- C .3n+4
- D .nlogn
- 正确答案: B 你的答案: C
-
解析:㏒₂n < n,做题的时候没有记熟,想当然的选了C
结对及互评
本周结对学习情况
- [20172324曾程](http://www.cnblogs.com/amberR/p/9670328.html)
- 博客中值得学习的或问题:
- 内容详略得当;
- 代码调试环节比较详细;
- 基于评分标准,我给本博客打分:14分。得分情况如下:
- 正确使用Markdown语法(加1分)
- 模板中的要素齐全(加1分)
- 教材学习中的问题和解决过程, 加4分
- 代码调试中的问题和解决过程, 加4分
- 本周有效代码超过300分行,加2分
- 其他加分,加2分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
学习进度条
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|
| -------- | :----------------😐:----------------😐:---------------: |:-----😐
| 目标 | 5000行 | 30篇 | 400小时 | |
| 第一周 | 0/0 | 1/1 | 8/8 | |
| 第二周 | 671/671 | 1/2 | 17/25 | |
参考资料
- [Java软件结构与数据结构](第四版)
- Java泛型详解
- 《Java学习笔记(第8版)》学习指导