一、数据结构基本概念
-数据:一切可以输入计算机并能被处理的都是数据;
-数据元素
-数据对象
学生-数据对象,姓名,性别,身高,课程代号是数据元素,身高是数据项。
二、数据结构(data structure)
》逻辑结构
-集合:元素罗列在一起
-线性结构:元素前后相继(一一对应)
-树形结构:元素存在一对多的关系
-图结构或网状结构:元素之间存在多对多的关系。
》存储结构
-顺序存储:地址连续,用数组。
-链式存储:地址不连续,用指针(引用,面向对象)。
树和图基本都是链式存储,其他存储结构基本都是顺序存储和链式存储。
三、数据结构就是用一种特别的方式存起来,便于方便的取出来。
数据结构的主要运算(操作)
为了某种特殊需求(取数据),而专门设计的数据存储方式。
①建立一个数据结构;②消除一个数据结构;③删除;④插入;⑤访问;⑥修改;⑦排序;⑧查找;
四、列表:顺序表和链表
>定义列表接口
>用数组实现-MyArrayList
>实现链表
>java List API
>相关技巧
五、用顺序存储(数组)来实现列表
5.1建一个接口
public interface MyList {
void add(Object element);//新增一个元素
void delete(Object element);//删除相同元素
void deleteByIndex(int index);//根据索引删除元素
void update(int index,Object newElement);//将指定索引位置的元素替换成新元素
boolean contains(Object target);//当前列表中是否含有target元素
Object at(int index);//根据指定索引返回元素
int indexOf(Object element);//查找element所在的索引,如果没有返回-1
}
5.2写实现类
public class MyArrayList implements MyList{
private Object[] elements;//真正存储元素的底层结构
private int size;//元素个数
private int capacity=10;//容量
public MyArrayList(int capacity) {//指定数组容量
this.capacity = capacity;
elements=new Object[capacity];
}
public MyArrayList() {//默认数组容量
elements=new Object[capacity];
}
@Override
public void add(Object element) {
if(size==capacity) {//扩容
capacity*=2;
Object[] newArr=new Object[capacity];//因为数组长度不可变,所以要新建一个新的数组,把旧的数组元素拷过来
for(int i=0;i<size;i++) {//O(n),耗费时间,耗费内存
newArr[i]=elements[i];
}
elements=newArr;//把旧的那个数组丢掉
}else {
elements[size++]=element;
}
}
@Override
public void delete(Object element) {
int index=indexOf(element);
if(index>=0) {
deleteByIndex(index);
}
}
@Override
public void deleteByIndex(int index) {//紧密
Object[] newArr=new Object[capacity-1];//因为数组长度不可变,所以要新建一个新的数组,把旧的数组元素拷过来
for(int i=0;i<size;i++) {//O(n),耗费时间,耗费内存
if(i==index) continue;
newArr[i]=elements[i];
}
elements=newArr;//把旧的那个数组丢掉
}
@Override
public void update(int index, Object newElement) {
elements[index]=newElement;
}
@Override
public boolean contains(Object target) {
return indexOf(target)>0;
}
@Override
public Object at(int index) {
return elements[index];
}
@Override
public int indexOf(Object element) {
for(int i=0;i<size;i++) {
if(elements[i].equals(element)) {
return i;
}
}
return -1;
}
//重写toString
@Override
public String toString() {
StringBuilder sb=new StringBuilder("[");
for(int i=0;i<size;i++) {
sb.append(elements[i]+(i==size-1?"":","));
}
sb.append("]");
return sb.toString();
//return "MyArrayList [elements=" + Arrays.toString(elements) + "]";//输出结果为:MyArrayList [elements=[周婷婷, 乐观, 勤奋, null, null, null, null, null, null, null]]
}
}
5.3测试类
public class MyArrayListTest{
public static void main(String[] args) {
MyArrayList list=new MyArrayList();
list.add("周婷婷");
list.add("勤奋");
list.add("乐观");
list.add("修改内容");
list.add("删除内容");
list.add("删除下标");
list.delete("删除内容");
list.deleteByIndex(5);
list.update(3, "内容被修改了");
boolean contain= list.contains("乐观");
int indexOf=list.indexOf("勤奋");
System.out.println(list);
System.out.println(contain);
System.out.println(indexOf);
}
}
5.4运行结果