线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,
常见的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可以分为:
- 静态顺序表:使用定长数组存储。
- 动态顺序表:使用动态开辟的数组存储。
静态顺序表适用于确定知道需要存多少数据的场景.
静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用.相比之下动态顺序表更灵活, 根据需要动态的分配空间大小.
注意
- 顺序表在物理上是连续的,在逻辑上也是连续的
- 存放元素必须是连续存储不能跨空间存储
代码
import java.util.Arrays;
public class MyArraylist {
int[] element;//数组
int size;//线性表实际大小
public MyArraylist() {
this.size=0;
this.element=new int[4];
}
public MyArraylist(int capacity) {
this.size=0;
this.element=new int[capacity];
}
// 打印顺序表
public void display() {
for (int i=0;i<this.size;i++){
System.out.print(this.element[i]+" ");
}
System.out.println();
}
//线性表是否满
public boolean isFull() {
if (this.size==this.element.length){
return true;
}
return false;
}
//扩容
public void resize( ) {
this.element= Arrays.copyOf(this.element,2*this.element.length);
}
//在 pos 位置新增元素
public void addPos(int pos, int data) {
if (pos<0||pos>this.element.length-1){
System.out.println("插入位置不合法");
return;
}
if (isFull()){
//System.out.println("线性表已满");
resize();
}
//pos位置后面的所有元素后移
for (int i=this.size-1;i>=pos;i--){
this.element[i+1]=this.element[i];
}
//插入元素
this.element[pos]=data;
this.size++;
}
//默认插入到数组的最后
public void addTail(int data) {
if (isFull()){
resize();
}
this.element[this.size]=data;
this.size++;
}
// 判定是否包含某个元素
public boolean contains(int toFind) {
for (int i=0;i<this.size;i++){
if (this.element[i]==toFind){
return true;
}
}
return false;
}
// 查找某个元素对应的位置
public int search(int toFind) {
for (int i=0;i<this.size;i++) {
if (this.element[i] == toFind) {
return i;
}
}
return -1;
}
// 获取顺序表长度
public int size() {
return this.size;
}
// 获取 pos 位置的元素
public int getPos(int pos) {
if (pos<0||pos>this.size-1){
System.out.println("查找位置不合法");
}
return this.element[pos];
}
// 给 pos 位置的元素修改为 value
public void setPos(int pos, int value) {
if (pos<0||pos>this.size-1){
System.out.println("修改位置不合法");
}
this.element[pos]=value;
}
//删除第一次出现的关键字key
public void remove(int key) {
int index=search(key);
//i到最后一个元素的前一个元素的位置就可以,因为后面有i+1
for (int i=index;i<this.size-1;i++){
this.element[i]=this.element[i+1];
}
this.size--;
}
public void clear() {
/*
如果数组中国的元素是引用硬顶要把每个引用清空防止内存泄露
内存泄露的定义:当某些对象不再被应用程序所使用,
但是由于仍然被引用而导致垃圾收集器不能释放(Remove,移除)他们.
*/
/*for(int i=0;i<this.size-1;i++){
element[i]=null;
}*/
this.size=0;
}
public static void main(String[] args) {
MyArraylist myArraylist=new MyArraylist(4);
//指定位置插入元素
myArraylist.addPos(0,10);
myArraylist.addPos(1,20);
myArraylist.addPos(2,30);
//打印
myArraylist.display();
//尾插法
myArraylist.addTail(40);
myArraylist.display();
myArraylist.addTail(50);
myArraylist.display();
myArraylist.addPos(2,60);
myArraylist.display();
//查找元素
int index=myArraylist.search(60);
System.out.println("查找元素的位置:"+index);
//元素是否存在
boolean bool=myArraylist.contains(60);
System.out.println("查找元素是否存在:"+bool);
//获取指定位置元素
int val=myArraylist.getPos(2);
System.out.println("获取指定位置元素:"+val);
//修改指定位置元素
myArraylist.setPos(2,70);
myArraylist.display();
//线性表大小
int size=myArraylist.size();
System.out.println("线性表的大小:"+size);
//删除元素
myArraylist.remove(70);
myArraylist.display();
//清空线性表
myArraylist.clear();
size=myArraylist.size();
System.out.println("清空线性表后的大小:"+size);
myArraylist.display();
}
}
- 测试用例