实现一个顺序表
接口实现
定义一个MyArrayList类,在类中实现以下函数
1
2
3
|
public class MyArrayList { } |
数组的定义
1
2
3
4
5
|
public int [] elem; //定义一个整形数组 public int usize; //usize表示数组的长度 public MyArrayList(){ this .elem = new int [ 5 ]; } |
打印顺序表
for循环打印顺序表的每一位
1
2
3
4
5
6
|
public void display(){ for ( int i = 0 ; i < this .usize; i++) { System.out.print( this .elem[i]+ " " ); } System.out.println(); } |
在pos位置新增元素
先定义一个isFull函数判断顺序表是否满了,满了返回true,没满则返回false
1
2
3
4
5
6
|
public boolean isFull(){ if ( this .usize == this .elem.length){ return true ; } return false ; } |
将pos位置后的元素后移,顺序表顺序表长度增加一位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public void add( int pos, int data){ //判断顺序表是否满了 if (isFull()){ System.out.println( "顺序表已满" ); //扩容 this .elem = Arrays.copyOf( this .elem, 2 * this .usize); } //判断pos的合法性 if (pos < 0 || pos > this .usize){ System.out.println( "pos位置不合法" ); return ; } //将pos位置后的数字后移 for ( int i = this .usize- 1 ; i >= pos; i--) { this .elem[i+ 1 ] = this .elem[i]; } this .elem[pos] = data; this .usize++; } |
判定是否包含某个元素
1
2
3
4
5
6
7
8
|
public boolean contains( int key){ for ( int i = 0 ; i < this .usize; i++) { if ( this .elem[i] == key){ return true ; } } return false ; } |
查找某个对应元素的位置
返回它的位置
1
2
3
4
5
6
7
8
|
public int search( int key){ for ( int i = 0 ; i < this .usize; i++) { if ( this .elem[i] == key){ return i; } } return - 1 ; } |
获取pos位置的元素
定义一个isEmpty函数判断顺序表是否为空
1
2
3
|
public boolean isEmpty(){ return this .usize == 0 ; } |
1
2
3
4
5
6
7
8
9
10
11
|
public int getPos( int pos){ //判断顺序表是否为空 if (isEmpty()){ return - 1 ; } //判断pos 位置是否合法 if (pos < 0 || pos >= this .usize){ return - 1 ; } return this .elem[pos]; } |
给pos位置的元素设为value 更新为新的数字
1
2
3
4
5
6
7
8
9
10
11
|
public void setPos( int pos, int value){ //判断顺序表是否为空 if (isEmpty()){ return ; } //判断pos位置是否合法 if (pos < 0 || pos >= this .usize){ return ; } this .elem[pos] = value; } |
删除第一次出现的关键字key
查找到关键字,从关键字所在的位置开始到顺序表结束每一项前移,覆盖掉关键字,长度减少一位
1
2
3
4
5
6
7
8
9
10
11
|
public void remove( int key){ int index= search(key); if (key == - 1 ){ System.out.println( "关键字不存在" ); return ; } for ( int i = key; i < this .usize- 1 ; i++) { this .elem[i] = this .elem[i+ 1 ]; } this .usize--; } |
获取顺序表长度
1
2
3
|
public int size(){ return this .usize; } |
清空顺序表
顺序表长度直接为0
1
2
3
|
public void clear(){ this .usize = 0 ; } |
实现这个顺序表
定义一个测试类,测试这些函数的输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public class TestDemo { public static void main(String[] args) { MyArrayList myArrayList = new MyArrayList(); //给这个顺序表写入1,2,3,4,5 myArrayList.add( 0 , 1 ); myArrayList.add( 1 , 2 ); myArrayList.add( 2 , 3 ); myArrayList.add( 3 , 4 ); myArrayList.add( 4 , 5 ); //打印这个顺序表 myArrayList.display(); //判定5这个元素是否在该顺序表中 System.out.println(myArrayList.contains( 5 )); //查找5这个元素 返回它的位置 System.out.println(myArrayList.search( 5 )); //获取3位置的元素 System.out.println(myArrayList.getPos( 3 )); //将4位置的元素重新赋值为9 myArrayList.setPos( 4 , 9 ); //打印新的顺序表 myArrayList.display(); //删除第一次出现的元素4 myArrayList.remove( 4 ); //打印新的顺序表 myArrayList.display(); //获取顺序表的长度 System.out.println(myArrayList.size()); System.out.println( "清空" ); //清空顺序表 myArrayList.clear(); //打印新的顺序表 myArrayList.display(); } } |
得到结果:
顺序表的优缺点
优点:顺序表查找方便,知道这个元素的位置就可以直接找到这个元素。
缺点:扩容一般成2倍增长,会有一定的空间浪费。
原文链接:https://blog.csdn.net/weixin_46494806/article/details/115678332