什么叫做顺序表
用一组地址连续的存储单元依次存储线性表的数据元素。
顺序表的特点
- 逻辑结构上相邻,物理结构上也相邻。
- 存在唯一的一个被称作“第一个”的元素,也存在唯一一个被称作“最后一个”的元素。
- 除第一个以外,集合中的每个数据元素均只有一个前驱,除最后一个之外,集合中每个数据元素均只有一个后继。
顺序表的优点和缺点
优点:
- 空间利用率高,因为是连续存储,所以不会造成空间浪费;
- 存取速度快,因为利用下标。
缺点:
- 插入和删除慢,需要移动大量元素;
- 空间分配固定,不够灵活。
顺序表的实现
所有方法:
public boolean add(int elem);
public boolean insert(int index,int elem);
public boolean set(int index,int elem);
public boolean delete(int index);
public boolean clear();
public boolean isEmpty();
public int size();
public boolean contains(int elem);
public int get(int index);
public void printList();
实现方法:
class MyList{
private int arr[];
private int length;
private int in = 0;
public MyList (int length) {
this.arr = new int[length];
this.length = length;
}
public boolean add(int elem) {
if(this.size()<this.length) {
arr[this.size()] = elem ;
in++;
return true;
}
return false;
}
public boolean clear() {
int cur = this.length-1;
while(cur!=-1) {
this.delete(cur--);
}
return true;
}
public boolean contains(int elem) {
int cur = 0;
while(cur!=this.length) {
if(arr[cur]==elem) return true;
cur++;
}
return false;
}
public boolean delete(int index) {
int cur = index;
if(index>=this.length || index<0) return false;
while(cur!=this.size()) {
arr[cur] = arr[cur+1];
cur++;
}
arr[this.size()] = 0;
return true;
}
public int get(int index) {
if(index>=this.length || index<0) return -1;
return arr[index];
}
public boolean insert(int index, int elem) {
int cur = this.size();
if(this.size()>=this.length) return false;
while(cur!= index-1) {
arr[cur] = arr[cur-1];
cur--;
}
arr[index] = elem;
return true;
}
public boolean isEmpty () {
if(this.size() == 0) return true;
return false;
}
public boolean set(int index, int elem) {
arr[index] =elem;
return true;
}
public int size() {
return this.in;
}
public void printList() {
for(int i = 0;i<this.size();i++) {
System.out.println(arr[i]);
}
}
}
测试:
MyList myList = new MyList(5);
myList.add(4);
myList.add(3);
myList.add(7);
myList.add(9);
myList.insert(2,8); // 向下标为2的元素的前面插入8
myList.set(3,1);
System.out.println("空表? " + myList.isEmpty());
System.out.println("包含3吗? " + myList.contains(3));
System.out.println("下标为2的元素的值: " +myList.get(2));
System.out.println("size: " +myList.size());
myList.delete(1);
myList.printList();
myList.clear();
输出:
空表? false
包含3吗? true
下标为2的元素的值: 8
size: 4
4
8
1
9