一、线性表
线性表是最基本、最简单、也是最常用的一种数据结构。一个线性表是n个具有相同特性的数据元素的有限序列。
1.1 前驱元素
若A元素在B元素的前面,则称A为B的前驱元素
1.2 后继元素
若B元素在A元素的后面,则称B为A的后继元素
1.3线性表的特征
数据元素之间具有—种“—对一”的逻辑关系。.
1.第一个数据元素没有前驱,这个数据元素被称为头结点;
2.最后一个数据元素没有后继,这个数据元素被称为尾结点;
3.除了第一个和最后一个数据元素外,其他数据元素有且仅有一个前驱和一个后继。
如果把线性表用数学语言来定义,则可以表示为( a1…ai-1,ai,ai+1…an) , ai-1领先于ai,ai领先于ai+1,称ai-1是ai的前驱元素,ai+1是ai的后继元素.
1.4 线性表的分类
线性表中数据存储的方式可以是顺序存储,也可以是链式存储,按照数据的存储方式不同,可以把线性表分为顺序表和链表。
二、顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用─组地址连续的存储单元,依次存储线性表中的各个元素、使得线性表中再逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。
package Arrays;
import java.util.Arrays;
public class MyArray {
private int [] elements;//声明存储数据的数组
public MyArray(){
elements=new int[0];//初始化数组
}
//获取数组长度
public int length(){
return elements.length;
}
/**
* 向数组末尾添加元素
* @param
* element :要添加的元素
* elements[] :原数组
* newArray[]:新数组
*/
public void add(int element){
//新建数组,并扩容
int [] newArray=new int[elements.length+1];
//将原数组元素赋给新数组
for(int i=0;i<elements.length;i++){
newArray[i]=elements[i];
}
//向新数组末尾添加数据
newArray[elements.length]=element;
//使用新数组替换旧数组
elements=newArray;
}
//打印数组全部元素
public void show(){
System.out.println(Arrays.toString(elements));
}
/**
* 删除数组元素
* @param
* index:要删除的元素下标
*/
public void delete(int index){
//判断数组下标是否越界
if(index<0||index>elements.length-1) {
throw new RuntimeException("下标越界");
}
//创建新数组,长度为elements.length-1
int [] newArr=new int[elements.length-1];
//将原数组元素赋给新数组
for(int i=0;i<newArr.length;i++){
if(i<index){
//将要删除元素前面的数全部赋给新数组
newArr[i]=elements[i];
}else{
//将要删除元素后面的数全部赋给新数组
newArr[i]=elements[i+1];
}
}
//使用新数组替换旧数组
elements=newArr;
}
/**
* 获取某个元素
* index:获取元素的下标
*/
public int get(int index){
return elements[index];
}
/**
* 插入元素到指定位置
* index:目标元素要插入的位置
* value:目标元素的值
*/
public void insert(int value,int index){
//新建数组,并扩容
int [] newArray=new int[elements.length+1];
//将原数组元素赋给新数组
for(int i=0;i<elements.length;i++){
//目标元素之前的元素
if(i<index){
newArray[i]=elements[i];
}else{
//目标元素之后的元素
newArray[i+1]=elements[i];
}
}
//将目标元素放入新数组
newArray[index]=value;
//使用新数组替换旧数组
elements=newArray;
}
/**
* 替换指定位置的元素
*/
public void change(int index,int value){
//判断数组下标是否越界
if(index<0||index>elements.length-1) {
throw new RuntimeException("下标越界");
}
elements[index]=value;
}
//二分查找
public void BinarySearch(int value){
//记录开始位置
int left=0;
//记录结束位置
int right=elements.length-1;
//记录中间位置
int mid=(left+right)/2;
//记录目标数位置
int index=-1;
//循环查找
while(true){
//判断中间元素,是不是要查找的元素
if(value==elements[mid]){
//如果是,记录下标,并停止
index=mid;
break;
//如果不是
}else{
//目标数比中间位置的树大,目标数在中间数的右边
if(value>elements[mid]){