数据结构——java自定义数组队列

什么是数组队列?

    数组队列是利用数组这种数据结构来处理实现多个数据的类,增加了数组的灵活性。(在程序中数组的灵活性不够,因为定义的长度是死的。如果定义长了浪费内存,短了不够用)

数组队列的实现

    1.定义接口,定义需要的抽象方法
        a.增加元素的方法;在固定的位置 ,添加元素的方法;
        b.删除该数组中一个元素的方法(根据元素进行删除)
        c.删除一个位置上面的数据的方法(根据下标进行删除操作);
        ......
        总的来说,增删改等方法都是根据自己所需要的去定义
        
    2.为了让数组队列可以存储多种类型的数,改变数组只能存储一种数据的情况:使用泛型

        为什么使用泛型?

        泛型不是基本数据类型也不是引用数据类型,只是一种特殊符号,可以用来泛指java中的任何一种类型。如果定义数组时用了某一类,那数组只能存储一种数组。而定义数组之前并不知道将要存储什么数据类型,为了实现多种类型存储,使用泛型。

public interface MyAbstactArray<E> {

	public void add(E e);//向队列末尾添加一个元素
	public boolean add(int location,E e);//向队列指定位置添加元素,返回true表示插入成功,false表示插入失败
	public E get(int location);//获取指定位置元素
	public boolean remove(E e);//删除指定的元素,返回true表示成功,false失败
	public E remove(int location);//删除指定位置的元素,返回null表示成功,否则失败
	public boolean update(int location,E e);//更新指定位置的元素,返回true成功,false失败
	public boolean update(E old,E e);//用一个新的元素更新旧的指定元素
	public boolean removeall();//移除所有
	public int size();//获取数组队列中存储的元素总数 
}


    3.定义一个数组队列类实现接口,重写接口中的方法(其实可以直接不用定义接口实现它,简单点的话可以直接在数组队列类中定义方法,不需要重写接口中的方法)

        为什么使用Object定义数组?

        Object是所有类得到父类。虽然基本数据类型没有继承Object类,但是基本数据类型对应有一个封装类。因此基本可以说Object也算是基本数据类型的父类。如果设置为Object类型的数组,就可以存储不同类型的数据


public class MyArray<E> implements MyAbstactArray<E> {

	// 记录数组初始长度
	private int length = 1;
	// 声明记录数组队列中存储的元素个数
	private int size = 0;
	// 声明一个数组变量
	Object[] Array;

	public MyArray(int length) {
		this.length = length;
		Array = new Object[length];
	}
	
	@Override
	public void add(E e) {
		if (size < length) {
			Array[size] = e;
			size++;
		} else {
			Object[] newArray = new Object[2 * length];
			for (int i = 0; i < Array.length; i++) {
				newArray[i] = Array[i];
			}
			newArray[size] = e;
			Array = newArray;
			length = newArray.length;
			size++;
		}
	}

	@Override
	public boolean add(int location, E e) {
		if (location < 0 || location >= size) {
			System.out.println("超过size时使用该方法无法添加");
			return false;
		} else {
			Object[] newArray = new Object[size + 1];
			newArray[location] = e;
			for (int i = 0; i < location; i++) {
				newArray[i] = Array[i];
			}
			for (int i = location; i < size; i++) {
				newArray[i + 1] = Array[i];
			}
			Array = newArray;
			length = newArray.length;
			size++;
			return true;
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public E get(int location) {
		if (location < 0 || location >= size)
			return null;
		else
			return (E) Array[location];
	}

	@Override
	public boolean remove(E e) {
		for(int i = 0;i<size;i++) {
			if(Array[i] == e) {
				Array[i] = null;
				for(int j = i;j < size;j++) {
					Array[j] = Array[j+1];
				}
				size--;
			}
		}
		return true;
	}

	@Override
	public E remove(int location) {
		for (int i = 0; i < size; i++) {
			if (i == location) {
				Array[i] = null;
				for (int j = i; j < size - 1; j++) {
					Array[j] = Array[j + 1];
				}
			}
		}
		size--;
		return null;
	}

	@Override
	public boolean removeall() {
		Object[] newArray = new Object[0];
		Array = newArray;
		if (Array.length == 0)
			return true;
		else
			return false;
	}

	@Override
	public int size() {
		return size;
	}

	@Override
	public boolean update(int location, E e) {
		if (location < 0 || location >= size)
			Array[location] = e;
		return true;
	}

	@Override
	public boolean update(E old, E e) {
		for(int i = 0;i<size;i++) {
			if(Array[i] == old)  
				Array[i] = e;
		}
		return true;
	}
}

注:java中有自带的队列ArrayList可以使用

猜你喜欢

转载自blog.csdn.net/weixin_42621338/article/details/82080167