20180918 数据结构及线性表
声明:此为老师上课笔记相关整理,如有错误之处请指出
¦ 整本书讲的是模仿JDK的集合,然后写出属于自己的集合
¦ 什么是数据?
- 有用的信息才能称为数据
→数据结构中所指的数据指内存中的数据
→java对象
¦ 什么是数据结构?
- Java对象(数据)在内存中存放的形式,因为Java的数据类型分为简单类型和引用类型
- 简单类型
- byte short int long
- float double
- boolean char
- 引用类型
- 类
- 接口类型
- 数组类型
- 枚举类型
- 注解类型
- Tips:String也是引用类型的
- 简单类型
![]()
- 图解:内存机制分为栈区与堆区
- 栈区
- 像格子一样存放
- 简单类型的变量 他的变量名与变量直接存储
- 引用类型在栈区只储存名 引用类型数据存储在堆区 (e.g.字符串,new出一个新的对象)↓
- 堆区
- 存放在栈区声明的引用变量的变量
- 如果在堆区new了一个新的对象,他的属性名与在栈区new的对象的属性放在一起
- 而属性名所对应的数据另外存放在另一个池子里面
- 栈区
¦ 程序 = 数据结构 + 算法
- 在数据结构中封装算法
- 经典的集合数据结构
- 线性表
- *老师主要讲解了线性表
- 线性表的优点:有序,有索引维护,元素可以重复;可做基本的增,删,改,查操作;类似jdk中的list接口
- 分为:
- a.顺序表
- b.链表
- 栈
- 队列
- 线性表
讲解代码:
- 下面的代码分别为:接口类,实现类,测试类
1 /** 2 * @author Cypher 3 * @date 2018.09.18 4 * 这个类是接口的,实现类是另一个类 5 * 6 * */ 7 public interface Ilist { 8 //顺序表是可以自己扩容的 9 10 //顺序表完成自己的增删改查的动作 11 12 //增(封装两个方法):一个是在中间添加对象;一个是在末尾添加对象 13 //在集合i位置插入obj对象,i后的元素全部后移一位 14 //*补充一下:所以这也是ArrayList为什么删除元素的时候,只能从后往前删 15 void insert (int i ,Object obj); 16 //将obj添加到集合的末尾 17 void add(Object obj); 18 19 //删(封装两个方法):一个是在中间删除;一个是遍历集合,删除相对应得 20 //将i位置的元素删除,i后的元素通通前移一位 21 void remove(int i); 22 //从头到尾遍历集合,删除第一个遇到的obj 23 //被删除元素的位置,其后的元素都要前移一位 24 void remove(Object obj); 25 26 //改 27 //将i位置上的元素设置为obj(替换) 28 void set(int i,Object obhj); 29 30 //查(两个方法)注意,查的方法都是有返回值的 31 //获得i位置上的元素--依据索引查元素 32 Object get(int i); 33 //依据元素查索引 34 //在集合中查找obj,没有的话返回-1,有的话返回它的索引 35 int indexOf(Object obj); 36 37 //清空集合 38 void clear(); 39 //判断集合是否为空 40 boolean isEmpty(); 41 //获得集合的长度 42 int length(); 43 //展示集合中所有的元素(用来做测试) 44 void display(); 45 }
1 /** 2 * @author Cypher 3 * @date 2018.09.18 4 * 这是接口的实现类 5 * 6 * */ 7 8 public class myList implements Ilist{ 9 10 //集合底层数组:对象数组,用于存放集合中的元素 11 private Object[] es; 12 //集合中元素的个数--集合中放了多少元素--集合的长度 13 private int count; 14 15 //构造方法 16 //size 集合的容量 17 public myList(int size){ 18 //这里是,集合中能放多少元素--集合的容量 19 //es=emptysize 20 es = new Object[size]; 21 } 22 23 //可以写一个默认的存储数值 24 //空参构造方法,给集合16个元素的容量 25 public myList(){ 26 this(16);//→es = new Object[16]; 27 } 28 29 30 //最初的版本不进行扩容处理,全部方法写完之后写扩容 31 @Override 32 public void insert(int i, Object obj) { 33 34 //集合已满不能再添加元素 35 if(count==es.length){ 36 throw new RuntimeException("集合已满,不能再添加"); 37 } 38 //i的合理范围0~count 39 if(i<0 || i>count){ 40 throw new RuntimeException("索引合理的范围:0~"+count+",实际:"+i); 41 } 42 43 //将i位置及以后的元素通通后移一位 44 //如果添加一个数字,必须把最后一位数字先移走,再移倒数第二个,循环,直到空出来需要插入位置 45 //因为我们需要保护已有的数据 46 for(int j = count;j>i;j--){ 47 //将前一位的数字赋值到后一位数字上面,就完成了空位的动作 48 es[j]=es[j-1]; 49 } 50 51 //将obj放到i位置上 52 es[i] = obj; 53 count++;//长度+1 54 } 55 56 // 57 @Override 58 public void add(Object obj) { 59 //判断顺序表是否已满,集合已满就不能再添加元素 60 if(count==es.length){ 61 //抛出异常 62 throw new RuntimeException("集合已满,不能再添加"); 63 } 64 //没有添加之前,最后一个元素的索引count-1 65 //下一个索引为count 66 es[count]=obj; 67 count++; 68 } 69 70 @Override 71 public void remove(int i) { 72 // TODO Auto-generated method stub 73 74 } 75 76 @Override 77 public void remove(Object obj) { 78 // TODO Auto-generated method stub 79 80 } 81 82 @Override 83 public void set(int i, Object obhj) { 84 // TODO Auto-generated method stub 85 86 } 87 88 @Override 89 public Object get(int i) { 90 // TODO Auto-generated method stub 91 return null; 92 } 93 94 @Override 95 public int indexOf(Object obj) { 96 // TODO Auto-generated method stub 97 return 0; 98 } 99 100 @Override 101 public void clear() { 102 // TODO Auto-generated method stub 103 104 } 105 106 @Override 107 public boolean isEmpty() { 108 // TODO Auto-generated method stub 109 return false; 110 } 111 112 @Override 113 public int length() { 114 // TODO Auto-generated method stub 115 return 0; 116 } 117 118 119 120 //测试 121 @Override 122 public void display() { 123 for(int i = 0;i<count;i++){ 124 System.out.println(es[i]+"\t"); 125 } 126 } 127 128 }
1 import org.junit.Test; 2 3 4 public class TestDemo { 5 @Test 6 public void test1(){ 7 System.out.println("helloworld!"); 8 } 9 10 @Test 11 public void test2(){ 12 myList list = new myList(); 13 list.add("java"); 14 list.add("c#"); 15 list.add("php"); 16 list.add("python"); 17 list.add("javascript"); 18 list.add("sql"); 19 list.display(); 20 } 21 22 }
- 测试类中,引用了一个常用的测试的方法,是junit包下的test方法(使用JUnit4较好)
- 他可以直接测试而不用写main方法
- 作业代码没有完成,完成后重新补上

浙公网安备 33010602011771号