数据结构—顺序表
首先我们得明确在java中变量的内存原理
对于大多数刚接触一门语言的人来说变量里存储的就是参数,比如int a=2;很多人认为就是a里储存的就是2了,其实从内存机制来说,声明一个变量a时实质就是在内存空间上分配了一个空间并把变量a指向了这个空间的地址,当你对a进行操作就是对这个空间地址里的数据进行了操作。
其次就是java引用的内存原理
引用就是一个变量指向一个对象,而此时这个指向对象的变量就是引用变量,例如:A a =new A();此时a就是引用变量,它指向了对象A,也可以说a引用了一个A对象,我们可以通过a来操作A对对象,而a里存储的就是对象A的地址。
顺序表的定义及功能解释
**定义:**顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改。
接口实现: 静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多 了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下 面我们实现动态顺序表。
public interface ISequence {
//在pos位置插入val
boolean add(int pos,Object data);
// 查找关键字key 找到返回key的下标,没有返回null;
int search(Object key);
// 查找是否包含关键字key是否在顺序表当中(这个和search有点冲突)
boolean contains(Object key);
// 得到pos位置的值
Object getPos(int pos);
// 删除第一次出现的关键字key
Object remove(Object key);
// 得到顺序表的长度
int size();
// 打印顺序表
void display();
// 清空顺序表以防内存泄漏
void clear();
}
其次我们需要创建一个类来继承这个接口中所有的方法,从而我们进行逐一介绍:
由上图我们可以看出在这个类中我们需要添加的属性:
public class MySequenceImpl implements ISequence {
private Object[] elem;//数组名称
private int usedSize;//有效数据个数
private static final int DEFAULT_SIZE=10;//初始数组长度
public MySequenceImpl(){
this.elem=new Object[DEFAULT_SIZE];
this.usedSize=0;
}
打印顺序表
@Override
public void display() {
for (int i=0;i<this.usedSize;i++){//遍历
System.out.println(this.elem[i]+" ");
}
System.out.println();
}
在pos位置插入元素
如果超出我们初始化定义的数组长度就需要进行数组扩容!
private boolean isFull(){
return this.usedSize==this.elem.length; //2.判断是否为满
}
@Override
public boolean add(int pos, Object data) {
//1.pos的合法性进行判断
if (pos<0||pos>this.usedSize){
return false;
}
//2.判断是否为满
if (isFull()){
//二倍扩容—数组拷贝
//System.arraycopy();
this.elem= Arrays.copyOf(this.elem, 2*this.elem.length);//数组拷贝
}
for (int i=this.usedSize-1;i>=pos;i--){
this.elem[i+1]=this.elem[i];
}
this.elem[pos]=data;
this.usedSize++;
return true;
}
删除元素
@Override
public Object remove(Object key) {
int index =search(key);
if (index==-1){
return null;
}
Object data=this.elem[index];
for (int i=index;i<this.usedSize-1;i++){
this.elem[i]=this.elem[i+1];
}
this.usedSize--;
return data;
}
定位元素
private boolean isEmpty(){
return this.usedSize==0;
}
@Override
public int search(Object key) {
if (isEmpty()){
return -1;
}
for (int i=0;i<this.usedSize;i++){
if (this.elem[i].equals(key)){
return i;
}
}
return -1;
}
得到pos位置元素值
@Override
public Object getPos(int pos) {
if (pos<0||pos>=this.usedSize){
return null;
}
return this.elem[pos];
}
得到顺序表长度
@Override
public int size() {
return this.usedSize;
}