孤樱懶契 发表于 2021-6-25 17:28

【Java】数据结构-利用动态数组自定义栈LIFO

本帖最后由 孤樱懶契 于 2021-10-23 22:39 编辑



# 自定义数组执行结果截图

!(https://gitee.com/gylq/cloudimages/raw/master/img/image-20210625092414528.png)

# 自定义泛型数组代码(详解)

## Array.java(自定义泛型数组)

```java
public class Array<E> {

    private E[] data;
    private int size;//大小

    // 构造函数 转入数组的容量capacity构造Array
    public Array(int capacity){
      data =(E[])new Object;
      size = 0    ;
    }

    // 无参的构造函数,默认数组的容量capacity = 10
    public Array(){
      this(10); //调用有参构造函数传入10设定初始大小
    }

    // 获取数组中元素个数
    public int getSize(){
      return size;
    }

    // 获取数组的容量
    public int getCapacity(){
      return data.length;
    }

    //返回数组是否为空
    public boolean isEmpty(){
      return size == 0;
    }

    // 向所有元素后添加一个新元素
    public void addLast(E e){

//         if(size == data.length) {
//             throw new IllegalArgumentException("AddLast failed. Array is full.");
//         }
//         data = e;
//         size ++;
      add(size, e);
    }

    // 在所有元素前添加一个新元素
    public void addFirst(E e){
      add(0, e);
    }

    // 在第index个位置插入一个新元素e
    public void add(int index, E e){

      if(size == data.length) {
            throw new IllegalArgumentException("Add failed. Array is full.");
      }

      if(index < 0 || index > size ){
            throw new IllegalArgumentException("Add failed. Require index >=0 and index <= size.");
      }

      for(int i = size - 1 ; i >= index ; i--){
            data=data;
      }
      data = e;
      size ++;
    }

    // 获取index索引位置的元素
    public E get(int index){
      if(index < 0 || index >= size)
            throw new IllegalArgumentException("Get failed. Index is illegal.");
      return data;
    }

    // 修改index索引位置的元素为e
    public void set(int index, E e){
      if(index < 0 || index >= size)
            throw new IllegalArgumentException("set failed. Index is illegal.");
      data = e;

    }

    // 查找数组中是否有元素e
    public boolean contains(E e){
      for(int i = 0 ; i < size ; i++)
      {
            if(data.equals(e))
                return true;
      }
      return false;
    }

    // 查找数组中元素e所在的索引,如果不存在元素e,则返回-1
    public int find(E e){
      for(int i = 0 ; i < size ; i++)
      {
            if(data.equals(e))
                return i;
      }
      return -1;
    }

    // 从数组中删除index位置的元素,返回删除的元素
    public E remove(int index){
      if(index < 0 || index >= size)
      {
            throw new IllegalArgumentException("Remove failed. Index is illegal.");
      }
      E ret = data;
      for(int i = index + 1 ; i < size ; i ++)
      {
            data = data;
      }
      size --;
      data = null; //让他自动回收 非必须写loitering objects != memory leak
      return ret;
    }

    // 从数组中删除第一个元素,返回删除的元素
    public E removeFirst(){
      return remove(0);
    }

    // 从数组中删除最后一个元素,返回删除的元素
    public E removeLast(){
      return remove(size-1);
    }

    // 从数组中删除元素e
    public void removeElement(E e){
      int index = find(e);
      if(index != -1)
            remove(index);
    }


    //system.out.print()所输出的类型toString覆盖
    @Override
    public String toString(){

      StringBuilder res = new StringBuilder();
      res.append(String.format("Array: size = %d, capacity = %d \n", size, data.length));
      res.append('[');
      for(int i = 0 ; i < size ; i ++){
            res.append(data);
            if(i != size - 1)
                res.append(", ");
      }
      res.append(']');
      return res.toString();
    }
}

```

## Array.java(自定义动态数组)

```Java
public class Array<E> {

    private E[] data;
    private int size;//大小

    // 构造函数 转入数组的容量capacity构造Array
    public Array(int capacity){
      data =(E[])new Object;
      size = 0    ;
    }

    // 无参的构造函数,默认数组的容量capacity = 10
    public Array(){
      this(10); //调用有参构造函数传入10设定初始大小
    }

    // 获取数组中元素个数
    public int getSize(){
      return size;
    }

    // 获取数组的容量
    public int getCapacity(){
      return data.length;
    }

    //返回数组是否为空
    public boolean isEmpty(){
      return size == 0;
    }

    // 向所有元素后添加一个新元素
    public void addLast(E e){

//         if(size == data.length) {
//             throw new IllegalArgumentException("AddLast failed. Array is full.");
//         }
//         data = e;
//         size ++;
      add(size, e);
    }

    // 在所有元素前添加一个新元素
    public void addFirst(E e){
      add(0, e);
    }

    // 在第index个位置插入一个新元素e
    public void add(int index, E e){

      if(index < 0 || index > size ){
            throw new IllegalArgumentException("Add failed. Require index >=0 and index <= size.");
      }

      if(size == data.length) {
            resize(2 * data.length);
      }

      for(int i = size - 1 ; i >= index ; i--){
            data=data;
      }
      data = e;
      size ++;
    }

    // 获取index索引位置的元素
    public E get(int index){
      if(index < 0 || index >= size)
            throw new IllegalArgumentException("Get failed. Index is illegal.");
      return data;
    }

    // 修改index索引位置的元素为e
    public void set(int index, E e){
      if(index < 0 || index >= size)
            throw new IllegalArgumentException("set failed. Index is illegal.");
      data = e;

    }

    // 查找数组中是否有元素e
    public boolean contains(E e){
      for(int i = 0 ; i < size ; i++)
      {
            if(data.equals(e))
                return true;
      }
      return false;
    }

    // 查找数组中元素e所在的索引,如果不存在元素e,则返回-1
    public int find(E e){
      for(int i = 0 ; i < size ; i++)
      {
            if(data.equals(e))
                return i;
      }
      return -1;
    }

    // 从数组中删除index位置的元素,返回删除的元素
    public E remove(int index){
      if(index < 0 || index >= size)
      {
            throw new IllegalArgumentException("Remove failed. Index is illegal.");
      }
      E ret = data;
      for(int i = index + 1 ; i < size ; i ++)
      {
            data = data;
      }
      size --;
      data = null; //让他自动回收 非必须写loitering objects != memory leak

      if(size == data.length / 2)
            resize(data.length / 2);
      return ret;
    }

    // 从数组中删除第一个元素,返回删除的元素
    public E removeFirst(){
      return remove(0);
    }

    // 从数组中删除最后一个元素,返回删除的元素
    public E removeLast(){
      return remove(size-1);
    }

    // 从数组中删除元素e
    public void removeElement(E e){
      int index = find(e);
      if(index != -1)
            remove(index);
    }


    //system.out.print()所输出的类型toString覆盖
    @Override
    public String toString(){

      StringBuilder res = new StringBuilder();
      res.append(String.format("Array: size = %d, capacity = %d \n", size, data.length));
      res.append('[');
      for(int i = 0 ; i < size ; i ++){
            res.append(data);
            if(i != size - 1)
                res.append(", ");
      }
      res.append(']');
      return res.toString();
    }

    private void resize(int newCapacity){
      E[] newData = (E[])new Object;
      for(int i = 0 ; i < size ; i ++)
            newData = data;
      data = newData;
    }
}

```



## Main.java(调用自定义数组使用方法)

```java
public class Main {

    public static void main(String[] args){

      Array<Integer> arr = new Array(20);
      for(int i = 0 ; i < 10 ; i ++)
            arr.addLast(i);
      System.out.println(arr);

      //在index位置插入元素为100
      arr.add(1, 100);
      System.out.println(arr);

      //在第一个元素前面添加一个-1的元素
      arr.addFirst(-1);
      System.out.println(arr);
      //[-1, 0, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9]

      //删除索引为2的元素
      arr.remove(2);
      System.out.println(arr);

      //删除4这个元素
      arr.removeElement(4);
      System.out.println(arr);

      //删除第一个元素
      arr.removeFirst();
      System.out.println(arr);

    }
}

```

bugcode776 发表于 2021-6-25 19:03

666666666666666666666666
页: [1]
查看完整版本: 【Java】数据结构-利用动态数组自定义栈LIFO