20162329 张旭升 2017 - 2018 《程序设计与数据结构》第五周总结
20162329 2017-2018-1 《程序设计与数据结构》第五周学习总结
教材学习内容总结
1.学习目标
-
了解集合的概念
-
了解并使用抽象数据类型
-
初步了解使用Java泛型
-
学习栈这种数据结构
-
用数组、链表实现栈
2.学习内容
集合的概念:
集合是手机并组织其他对象的对象,他定义了访问和管理那些称为集合元素的其他对象的一种具体方式。在我们所学习的Java编程语言的庞大类库中,Java Collections API 就表示了一些使用不同方式实现的几类集合的类。
抽象数据类型:
事物的抽象往往可以隐藏其中大部分细节,只需要通过一些小的接口就可以控制一个庞大的体系,所以在编程时抽象的思维是非常重要的,当你需要将一件事情用编程的方法实现的时候,首先要做的是将这件事情抽象出一些接口,就拿车来举个例子:
首先车是一个庞大的体系,但是我们在控制车的时候却并没有去考虑车的内部零件是如何运作的,我们只是同过方向盘,踏板等来实现对它的控制,而这些我们实在知道的就是智造车的人给我们提供的接口。这样以来用户在使用它的时候就不需要考虑应该用哪个零件带动哪个零件它才能转弯这种实际问题。
这样看我们的类也是一样的,我们只是提供给用户一些看的到的方法(函数),用户通过这些方法的使用就能调用一个庞大的类,而并不需要去考虑类中的逻辑。
泛型
泛型是在Java 5.0后才开始支持基于泛型来定义类的,泛型的作用是在我们实例化类的对象时可以同时制定一种储存数据的类型,这样就避免了我们要为不同的被储存类创建多个相应类型的类,大大减少了代码复用,增加了代码的可用能力,而这种方法在我们的Java Collections API 中尤其有用,因为既然是集合就必定需要储存元素,但是每次用户用来存储的元素不可能都是一种类型,这时泛型的作用就大大体现。
栈
栈也是集合中的一种,他的模型就类似于现实中的羽毛球桶一样,每次放置的羽毛球都只能放在前一个羽毛球的后面, 每次取羽毛球的时候只能从后面取最后一个放进去的,也就是一种LIFO结构
3.用数组、链表实现栈
-
数组实现栈 ArrayStack
public class ArrayStack<T> implements Stack<T> { private final int DEFAULT_CAPACITY = 100; private int num; private T[] stack; public ArrayStack() { num = 0; stack = (T[])(new Object[DEFAULT_CAPACITY]); } public ArrayStack (int lenth) { num = 0; stack = (T[])(new Object[lenth]); } public void push (T element) { if (size() == stack.length) expandCapacity(); stack[num] = element; num++; } public T pop() throws Exception { if (isEmpty()) throw new Exception("Stack is empty"); num--; T result = stack[num]; stack[num] = null; return result; } public T peek() throws Exception { if (isEmpty()) throw new Exception("Stack is empty"); return stack[num -1]; } public boolean isEmpty() { return (num == 0); } public int size() { return num; } public String toString() { String result = ""; for (int scan = 0; scan < num; scan++) result = result + stack[scan].toString() + "\n"; return result; } 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; } }
-
链表实现栈 LinkedStack
public class LinkedStack<T> implements Stack<T> { private int num; private LinearNode<T> Next; public LinkedStack() { num = 0; Next = null; } public void push (T element) { LinearNode<T> temp = new LinearNode<T> (element); temp.setNext(Next); Next = temp; num++; } public T pop() throws Exception { if (isEmpty()) throw new Exception("Stack"); T result = Next.getElement(); Next = Next.getNext(); num--; return result; } public T peek() throws Exception { if (isEmpty()) throw new Exception("Stack"); return Next.getElement(); } public boolean isEmpty() { return (num == 0); } public int size() { return num; } public String toString() { String result = ""; LinearNode current = Next; while (current != null) { result = result + (current.getElement()).toString() + "\n"; current = current.getNext(); } return result; } }
Android 开发一个关于栈的小APP
界面布局:
EditText控件:输入需要加入栈中的元素
Button控件:设置push压栈操作和pop出栈操作
TextView控件:模拟栈的结构
活动代码
public class MainActivity extends AppCompatActivity{
EditText editText;
Button pop,push;
TextView Stack;
String result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText)findViewById(R.id.in);
pop = (Button)findViewById(R.id.pop);
push = (Button)findViewById(R.id.push);
Stack = (TextView)findViewById(R.id.Stack);
final ArrayStack<String> stack = new ArrayStack<>();
push.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
result = editText.getText().toString();
stack.push(result);
Stack.setText(stack.toString());
}
});
pop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
stack.pop();
Stack.setText(stack.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
效果截图
代码托管
结对及互评
本周并没有在结对方面有什么合作项目
点评模板:
- 博客中值得学习的或问题:
- 界面很好看
- 问题分析可以更详细
- 其他
希望我们结对在这学期能相互促进,技术更上一层楼。
本周结对学习情况
- [20162302](博客链接)
- 结对学习内容
- 一起讨论学习。
其他
这学期的课程难度增加了很多,有些时候感觉自己学到的东西还不扎实,导致有时候做一些懂非常困难,就算最终解决了也会花费很长时间,效率很低,希望能尽快适应新方式新进度。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/200 | 1/2 | 10/20 | 了解数据结构及算法 |
第二周 | 664/500 | 2/3 | 10/20 | 系统的学习了查找和排序 |
第五周 | 1333/1000 | 2/2 | 15/20 | 栈数据结构的学习 |