数据结构-顺序表 java实现

知识点

  • 线性表的顺序结构存储结构简称为顺序表。
  • 线性表逻辑顺序相邻,顺序表存储位置相邻。
  • 便于随机存取。
  • 删除和插入可能要移动大量元素,效率低。
  • 解决溢出的方法是新建另一个大容量数组,效率低。

实现

List接口:

public interface MyList {
	boolean isEmpty();    //判断是否为空
	
	int listLength();    //返回表的长度
	
	void add(Object object);    //添加元素
	
	boolean delete(int index);    //删除元素
	
	boolean insert(int index, Object object);    //插入元素
	
	Object get(int index);    //取表元素
	
	int find(Object object);    //查找某元素 返回索引
	
	void display();    //输出
	
	void clear();    //清空
}

SqList:

public class SqList implements MyList{
	private Object[] data;
	private int length;
	
	public SqList(int maxSize) {
		//初始化顺序表 构造一个maxSize大小的顺序表
		length = 0;
		data = new Object[maxSize];
	}
	
	public boolean isEmpty() {
		// 判断是否为空
		return length == 0;
	}
	
	
	public int listLength() {
		// 返回顺序表的长度
		return length;
	}

	public void add(Object object) {
		//添加元素
		if (length == data.length) {    //如果数组已经满了 扩大两倍
			resize(2*length);
		}
		data[length++] = object;
	}
	
	private void resize(int max) {
		//动态调整数组大小
		Object[] temp = new Object[max];
		for (int i = 0; i < length; i++) {
			temp[i] = data[i];
		}
		data = temp;
	}
	
	public boolean delete(int index) {
		// 删除元素
		if (length == data.length) {    //满了 导致最后一个删不掉 扩充
			resize(2*length);
		}
		if (index < 0 || index > length) {
			return false;
		}
		for (int i = index - 1; i < length; i++) {    //下标从要删除的地方开始移动 每次往前移一个
			data[i] = data[i+1];
		}
		length --;
		return true;
	}
	
	public boolean insert(int index, Object object) {
		// 插入元素
		if (length == data.length) {    //满了 扩充
			resize(2*length);
		}
		if (index < 0) {
			return false;
		}
		for (int i = length; i >= index-1; i--) {    //最后开始 每个往后移一个
			data[i] = data[i-1];
		}
		data[index-1] = object;
		length ++;
		return true;
	}
	
	public Object get(int index) {
		// 得到指定位置元素
		if (index < 0 || index > length) {
			return null;
		}
		return data[index-1];
	}
	
	public int find(Object object) {
		// 按元素查找
		int i = 0;
		while (i < length && !data[i].equals(object)) {
			i ++;
		}
		if (i >= length) {
			return -1;
		} else {
			return i+1;
		}
	}
	
	public void display() {
		// 输出顺序表
		for (int i = 0; i < length; i++) {
			System.out.print(data[i] + " ");
		}
		System.out.println();
	}
	
	public void clear() {
		//清空顺序表
		if (length != 0) {
			for (int i = 0; i < length; i++) {
				data[i] = null;
			}
			length = 0;
		}
	}
		
}

Test:

public class Test {

	public static void main(String[] args) {
		SqList sqList = new SqList(5);
		sqList.add("hello");
		sqList.add("world");
		sqList.add("hahah");
		sqList.add("open");
		sqList.add("your");
		
		System.out.println(sqList.isEmpty());
		System.out.println(sqList.listLength());
		sqList.display();
		
		if (sqList.delete(5)) {
			sqList.display();
		} else {
			System.out.println("Wrong");
		}
		
		
		if (sqList.insert(2, "what")) {
			sqList.display();
		} else {
			System.out.println("Wrong");
		}
		
		System.out.println(sqList.get(2));
		
		System.out.println(sqList.find("what"));
		
		sqList.clear();
		sqList.display();
	}
}

结果:


ps:代码中用到了算法中的1.3的resize方法。

       欢迎指正!

猜你喜欢

转载自blog.csdn.net/sinat_38617018/article/details/79569884