目录
线性表
具有相同特性数据元素的有限序列,称为线性表,数组就是一种的线性表。
常见的线性表有:顺序表,链表,栈,队列等等。
你可以把线性表在逻辑上想象成一条直线,也就是线性结构,但是在具体使用线性表的时候,并不一定在一条直线上面,也就是说线性表的物理结构不一定是连续的。
线性结构的存储方式有两种,顺序存储和链式存储。通常以数组和链式结构的形式进行存储。
顺序存储:
在逻辑上是一条直线,是连续的,物理结构上也是一条直线,也是连续的。
链式存储:
逻辑上是一条直线,但是物理结构上并不是连续存储的。
顺序表
顺序表是线性表中的一种,是用一段地址连续的空间来存储数据的线性结构。
是不是和数组的定义有点相似了,没错,顺序表就是使用数组来对数据进行增删改查的。
顺序表的模拟实现
class Onder{
public int[] elem; //数组 实现顺序表
public int useSize; //有效元素的个数
public static final int DEFAULT_UseSize = 5;
public onder() {
this.elem = new int[DEFAULT_UseSize];
}
}
当我们调用Onder的无参构造器的时候,系统会为我们构建好一个能存储5个int类型的数据空间。
也就是说将顺序表的底层容量设置为DEFAULT_UseSize。
新增元素
现在的顺序表中是没有任何数据中,我们此时就需要对顺序表进行新增元素的操作。
在顺序表的最后新增元素:
/**
* 判断顺序表是否已满
* @return
*/
public boolean IsFull() {
return this.elem.length == this.useSize;
}
/**
* 在顺序表的最后新增元素
* @param val
*/
public void add(int val) {
//先判断整个顺序表是否已满,如果已满,则需对顺序表进行扩容
if(IsFull()) {
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
}
this.elem[useSize++] = val;
}
在pos位置新增元素:
/**
* 检查pos位置是否合法
* @param pos
* @return
*/
public boolean index(int pos) {
return pos >= 0 && pos < this.useSize;
}
/**
* 在pos位置新增元素
* @param pos
* @param val
*/
public void add(int pos,int val) {
//先判断整个顺序表是否已满,如果已满,则需对顺序表进行扩容
if(IsFull()) {
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
}
//再判断pos位置是否合法
if(index(pos)) {
for (int i = this.elem.length-1; i > pos; i--) {
this.elem[i] = this.elem[i-1];
}
this.elem[pos] = val;
this.useSize++;
} else {
System.out.println("pos位置不合法,请检查合法性");
}
}
删除元素
删除第一次出现的关键字key
/**
* 删除第一次出现的关键字key
* @param key
*/
public void remove(int key) {
for (int i = 0; i < this.useSize-1; i++) {
if(this.elem[i] == key) {
for (int j = i; j < this.useSize-1; j++) {
this.elem[j] = this.elem[j+1];
}
this.useSize--;
this.elem[useSize] = 0; //最后一个元素置为0
return;
}
}
System.out.println("没有你要删除的关键字");
}
修改元素:
将pos位置的元素修改为val
/**
* 将pos位置的值改为val
* @param pos
* @param val
*/
public void set(int pos,int val) {
if(pos>=0 && pos< this.useSize) {
this.elem[pos] = val;
return;
}
System.out.println("pos位置不合法");
}
查找元素:
查找某个元素对应的位置
/**
* 查找某个元素对应的位置
* @param val
* @return
*/
public int indexOf(int val) {
for (int i = 0; i < this.useSize-1; i++) {
if(this.elem[i] == val) {
return i;
}
}
return -1;
}
获取pos位置的元素
/**
* 获取pos位置的值
* @param pos
* @return
*/
public int get(int pos) {
if(pos>=0 && pos< this.useSize) {
return this.elem[pos];
}
return -1;
}
判断是否包含某个元素
/**
* 判断是否包含某个元素的值
* @param val
* @return
*/
public boolean contains(int val) {
for (int i = 0; i < this.useSize-1; i++) {
if(this.elem[i] == val) {
return true;
}
}
return false;
}
获取顺序表的长度
/**
* 获取顺序表的长度
* @return
*/
public int size() {
return this.useSize;
}
清空顺序表
/**
* 清空顺序表
*/
public void clear() {
this.useSize = 0; //如果顺序表中存放的是引用类型,则需要将每一个元素全部置为null
}