1.线性表
所谓线性表,就是多个相同数据类型元素逻辑上呈直线排列,逻辑上连续,物理上不一定连续,我们把这种结构称为线性表
常见的线性表有:数组(顺序表)、链表、栈、队列、字符串
逻辑连续:1号元素位于2号元素之前,2号元素位于一号元素之后,这种先后顺序指的是逻辑上的先后,物理上不一定连续
物理连续:指的是线性表的元素之间在存储时,前一个元素一定挨着后一个元素来存储的,比如数组就是元素间的物理连续
2.动态数组
定义:在普通数组上增加了一个可以根据元素的个数动态调整数组大小的功能
Java中提供的数组都是静态数组int[] long[] char[] (定义之后无法修改长度)
需要我们定义一个类,扩展基础数组的功能
private int[] data;//定义一个动态数组
private int size;//size为有效元素的个数
public class Test {
private int[] data;//在类中定义一个数组
private int size;//size表示数组中的有效元素的个数也可以理解为有效元素索引的下一个位置的索引
}
若当前data数组已经满了,我们就给它”扩容”-> 使用Arrays.copyOf(old arr,arr.length)扩容
使用Arrays.copyOf(old,arr.length)就能把旧数组的所有内容都搬移到新数组,新数组长度为规定长度
public void grow(){//定义一个扩容方法
this.data= Arrays.copyOf(data,data.length*2);//将原先的数组扩容一倍后赋值给原数组
}
使用toString方法打印当前数组的内容
public String toString(){
String str = "[";
for (int i = 0; i < size; i++) {
str+=data[i];
if (i!=size-1){
str=str+",";
}
}
str=str+"]";
return str;
}
只要是数据结构无外乎增删改查
数据结构核心就是用于存储数据,操作数据
增加元素
1.add(int val):向当前的动态数组的末尾添加元素
public void add(int val){
data[size]=val;//在数组末尾插入元素
size++;
if (size==data.length){//判断数组是否已经满了,满了就扩容
grow();//调用扩容方法
}
}
2.addIndex(int index,int val):向当前动态数组中index的索引位置插入元素val
public void addIndex(int index,int val){
if (index<0||index>size){//判断插入的索引是否合法
System.err.println("add index illegal");
return;
}
for (int i = size-1; i >=index ; i--) {
//从最后一个元素开始往后挪,挪完索引index的位置的元素后循环结束
data[i+1]=data[i];
}
data[index]=val;//将index索引位置的元素赋值
size++;
if (size==data.length){//判断数组是否已满
grow();
}
}
查询元素
1.public int getByValue(int val)查询当前动态数组第一个值为val的元素,返回索引
public int getByValue(int val){
for (int i = 0; i < size; i++) {//遍历数组
if (data[i]==val){//当找到所需元素时返回索引i
return i;
}
}
return -1;//未找到所需元素
}
2.public boolean contains(int val):查询当前动态数组中是否包含值为val的元素,若存在返回true,否则返回false
public boolean contains(int val){
for (int i = 0; i < size; i++) {
if (data[i]==val){//判断是否存在值为val的元素
return true;
}
}
return false;//不存在返回false
}
3.public int get(int index):查询当前动态数组中索引为index的元素值
public int get(int index){
if (index>size-1||index<0){//判断索引是否合法
System.out.println("add index illegal");
return -1;
}
return data[index];
}
修改元素
1.public int set (int index,int newVal):修改index位置的元素为新的值newVal,返回修改前的值
public int set(int index,int newVal){
if (index>size||index<0){//判断索引是否合法
System.out.println("set index illegal");
return -1;
}
int oldVal = data[index];
data[index] = newVal;//将索引index位置的元素更改为newVal
return oldVal;
}
2.public boolean set(int oldVal,int newVal):修改第一个值为oldVal的元素,更改为新的元素newVal,返回是否修改成功
public int remove(int index){
int oldVal = data[index];
for (int i = index; i <size-1 ; i++) {
//从index位置开始往前挪,把最后一位挪完循环终止
data[i]=data[i+1];
}
size--;//有效元素-1
return oldVal;
}
删除元素
1.public int remove(int index):删除索引为index对应的元素,返回删除前的元素
public int remove(int index){
int oldVal = data[index];
for (int i = index; i <size-1 ; i++) {
//从index位置开始往前挪,把最后一位挪完循环终止
data[i]=data[i+1];
}
size--;//有效元素-1
return oldVal;
}
2.public int removeFirst():删除数组的头元素
public int removeFirst(){
return remove(0);//调用remove方法删除第一个元素
}
3.public int removeLast():删除数组最后一个元素
public int removeLast(){
return remove(size-1);//调用remove方法删除最后一个元素
}
3.public boolean removeByValueOnce(int val):删除一个值为val的元素,返回是否删除成功
public boolean removeByValueOnce(int val){
for (int i = 0; i < size; i++) {
if (data[i]==val){//找到元素val对应的索引i
for (int j = i; j <size-1 ; j++) {//从i的位置开始,后面的元素往前移动一位
data[i]=data[i+1];
}
size--;//移动完后有效元素-1
return true;
}
}
return false;
}