• Java数据结构的实现


    1.基于数组的链表

     1 package array;
     2 
     3 import java.util.Arrays;
     4 
     5 /**
     6  * 基于数组的链表
     7  * 
     8  * @author 王彪
     9  *
    10  */
    11 public class MyArrayList {
    12     private static Object[] elements = null;
    13     private static int size = 0;
    14     private static final int DEFUAT_INITIAL_CAPACITY = 10;
    15 
    16     public MyArrayList() {
    17         this(10);
    18     }
    19 
    20     public MyArrayList(int initialCapacity) {
    21         if (initialCapacity < 0) {
    22             throw new IllegalArgumentException("输入容量有误");
    23         }
    24         elements = new Object[initialCapacity];
    25     }
    26 
    27 //初始化数组
    28     // 保存新元素
    29     public void add(Object ele) {
    30         // 数组的扩容问题
    31         if (size == elements.length) {
    32             Object[] temp = Arrays.copyOf(elements, elements.length * 2);
    33             elements = temp;
    34         }
    35         elements[size] = ele;
    36         size++;
    37     }
    38 
    39     public Object get(int index) {
    40         if (index < 0 || index >= size) {
    41             throw new IllegalArgumentException("输入索引有误");
    42         }
    43         return elements[index];
    44     }
    45 
    46     public void set(int index, Object newPlayerNum) {
    47         if (index < 0 || index >= size) {
    48             throw new IllegalArgumentException("输入索引有误");
    49         }
    50         elements[index] = newPlayerNum;
    51     }
    52 
    53     public void remove(int index) {
    54         if (index < 0 || index >= size) {
    55             throw new IllegalArgumentException("输入索引有误");
    56         }
    57         for (int i = index; i < size - 1; i++) {
    58             elements[i] = elements[i + 1];
    59         }
    60         elements[size - 1] = null;
    61         size--;
    62     }
    63 
    64     public String toString() {
    65         if (elements == null) {
    66             return null;
    67         }
    68         if (size == 0) {
    69             return "[]";
    70         }
    71         StringBuilder sb = new StringBuilder(size * 3 + 1);
    72         sb.append("[");
    73         for (int i = 0; i < size; i++) {
    74             sb.append(elements[i]);
    75             if (i < size - 1) {
    76                 sb.append(",");
    77             }
    78             if (i == size - 1) {
    79                 sb.append("]");
    80             }
    81         }
    82         return sb.toString();
    83     }
    84 
    85     public int size() {
    86         return size;
    87     }
    88 
    89     public boolean isEmpty() {
    90         return size == 0;
    91     }
    92 
    93     public void clear() {
    94         this.elements = new Object[DEFUAT_INITIAL_CAPACITY];
    95         size = 0;
    96     }
    97 
    98 }

    2.双向链表

     1 package linked;
     2 
     3 public class MyLinkedArrayList {
     4     protected Node first;
     5     protected Node last;
     6     protected int size;
     7 
     8     public void addFirst(Object ele) {// 在头部增加
     9         Node node = new Node(ele);
    10         if (size == 0) {
    11             this.first = node;
    12             this.last = node;
    13         } else {
    14             node.next = this.first;
    15             this.first.prev = node;
    16             this.first = node;
    17         }
    18         size++;
    19     }
    20 
    21     public void addLast(Object ele) {// 在尾部增加
    22         Node node = new Node(ele);
    23         if (size == 0) {
    24             this.first = node;
    25             this.last = node;
    26         } else {
    27             this.last.next = node;
    28             node.prev = this.last;
    29             this.last = node;
    30         }
    31         size++;
    32     }
    33 
    34     public void remove(Object ele) {
    35         Node current = this.first;
    36         for (int i = 0; i < size; i++) {
    37             if (!current.ele.equals(ele)) {
    38                 if (current.next == null) {
    39                     return;
    40                 }
    41                 current = current.next;
    42             }
    43         }
    44         if (current == this.first) {
    45             this.first = current.next;
    46             this.first.prev = null;
    47         } else if (current == this.last) {
    48             this.last = current.prev;
    49             this.last.next = null;
    50         } else {
    51             current.prev.next = current.next;
    52             current.next.prev = current.prev;
    53         }
    54         size--;
    55     }
    56 
    57     @Override
    58     public String toString() {
    59         if (size == 0) {
    60             return "[]";
    61         } else {
    62             StringBuilder sb = new StringBuilder(size * 3 + 1);
    63             Node current = this.first;// 第一个节点
    64             sb.append("[");
    65             for (int i = 0; i < size; i++) {
    66                 sb.append(current.ele);
    67                 if (i != size - 1) {
    68                     sb.append(",");
    69                 } else {
    70                     sb.append("]");
    71                 }
    72                 current = current.next;
    73             }
    74             return sb.toString();
    75         }
    76     }
    77 
    78     public class Node {
    79         public Node(Object ele) {
    80             this.ele = ele;
    81         }
    82 
    83         Node prev;
    84         Node next;
    85         public Object ele;
    86     }
    87 }

    3.双向队列

     1 package deque;
     2 
     3 import linked.MyLinkedArrayList;
     4 
     5 public class MyDeque extends MyLinkedArrayList {
     6     public Object getFirst() {
     7         return this.first.ele;
     8     }
     9 
    10     public Object getLast() {
    11         return this.last.ele;
    12     }
    13 
    14     public void removeFirst(Object ele) {
    15         super.remove(this.first);
    16     }
    17 
    18     public void removeLast(Object ele) {
    19         super.remove(this.last);
    20     }
    21 
    22     public void addFirst(Object ele) {
    23         super.addFirst(ele);
    24     }
    25 
    26     public void addLast(Object ele) {
    27         super.addLast(ele);
    28     }
    29 
    30 }

    4.堆

     1 package stack;
     2 
     3 import array.MyArrayList;
     4 
     5 //
     6 public class MyStack extends MyArrayList {
     7     // 入栈
     8     public void push(Object ele) {
     9         super.add(ele);
    10     }
    11 
    12     // 删除栈顶元素
    13     public void pop() {
    14         int index = super.size() - 1;
    15         super.remove(index);
    16     }
    17 
    18     // 查询栈顶元素
    19     public Object peek() {
    20         int index = super.size() - 1;
    21         return super.get(index);
    22     }
    23 
    24 }
  • 相关阅读:
    23种设计模式之责任链模式
    23种设计模式之中介者模式
    23种设计模式之代理模式
    23种设计模式之原型模式
    23种设计模式之模板方法模式
    23种设计模式之建造者模式
    23中设计模式之抽象工厂模式
    批处理产生001到999之间的数字
    批处理随机显示星期几
    批处理简易密码登录
  • 原文地址:https://www.cnblogs.com/AmosWong/p/9549573.html
Copyright © 2020-2023  润新知