加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java 集合的简单实现 (ArrayList & LinkedList & Queue

发布时间:2020-12-14 06:32:58 所属栏目:Java 来源:网络整理
导读:ArrayList 就是数组实现的啦,没什么好说的,如果数组不够了就扩容到原来的1.5倍 实现了迭代器 span style="color: #0000ff;"import span style="color: #000000;" java.io.Serializable; span style="color: #0000ff;"import span style="color: #000000;"

ArrayList

就是数组实现的啦,没什么好说的,如果数组不够了就扩容到原来的1.5倍

实现了迭代器

<span style="color: #0000ff;">import<span style="color: #000000;"> java.io.Serializable;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.Arrays;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.Iterator;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.NoSuchElementException;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.RandomAccess;

<span style="color: #008000;">/**<span style="color: #008000;">

  • <span style="color: #808080;">@author<span style="color: #008000;"> wenr

  • 实现方法:

    • void add(E e)
    • void add(int index,E e)
    • E get(int index)
    • int indexOf(Object o)
    • boolean contains(Object o)
    • int size()
    • boolean isEmpty()
    • E remove(int index)
    • boolean remove(Object o)
    • Iterator iterator()
  • <span style="color: #008000;">*/
    <span style="color: #0000ff;">public <span style="color: #0000ff;">class ArrayListDemo <span style="color: #0000ff;">implements<span style="color: #000000;"> RandomAccess,Cloneable,Serializable{

    <span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">final <span style="color: #0000ff;">int DEFAULT_SIZE = 10<span style="color: #000000;">;

    <span style="color: #0000ff;">private<span style="color: #000000;"> Object[] elementData;
    <span style="color: #0000ff;">private <span style="color: #0000ff;">int size = 0<span style="color: #000000;">;

    ArrayListDemo() {
    <span style="color: #0000ff;">this<span style="color: #000000;">(DEFAULT_SIZE);
    }

    ArrayListDemo(<span style="color: #0000ff;">int<span style="color: #000000;"> initialCapacity) {
    <span style="color: #0000ff;">if (initialCapacity < 0<span style="color: #000000;">) {
    <span style="color: #0000ff;">throw <span style="color: #0000ff;">new IllegalArgumentException("初始化参数错误:" +<span style="color: #000000;"> initialCapacity);
    } <span style="color: #0000ff;">else<span style="color: #000000;"> {
    elementData = <span style="color: #0000ff;">new<span style="color: #000000;"> Object[initialCapacity];
    }
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> add(E e) {
    isCapacityEnough(size + 1<span style="color: #000000;">);
    elementData[size++] =<span style="color: #000000;"> e;
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">void add(<span style="color: #0000ff;">int<span style="color: #000000;"> index,E e) {
    rangeCheckForAdd(index);
    isCapacityEnough(size + 1<span style="color: #000000;">);
    System.arraycopy(elementData,index,elementData,index + 1,size -<span style="color: #000000;"> index);
    elementData[index] =<span style="color: #000000;"> e;
    size++<span style="color: #000000;">;
    }

    <span style="color: #0000ff;">private <span style="color: #0000ff;">void rangeCheckForAdd(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
    <span style="color: #0000ff;">if (index < 0 || index ><span style="color: #000000;"> size)
    <span style="color: #0000ff;">throw <span style="color: #0000ff;">new IndexOutOfBoundsException("下标越界:" +<span style="color: #000000;"> index);
    }

    <span style="color: #0000ff;">private <span style="color: #0000ff;">void isCapacityEnough(<span style="color: #0000ff;">int<span style="color: #000000;"> capacity) {
    <span style="color: #008000;">//<span style="color: #008000;"> 溢出
    <span style="color: #0000ff;">if (capacity < 0<span style="color: #000000;">)
    <span style="color: #0000ff;">throw <span style="color: #0000ff;">new<span style="color: #000000;"> OutOfMemoryError();
    <span style="color: #008000;">//<span style="color: #008000;"> 需要扩容
    <span style="color: #0000ff;">if (capacity - elementData.length > 0<span style="color: #000000;">)
    grow(capacity);
    }

    <span style="color: #0000ff;">private <span style="color: #0000ff;">void grow(<span style="color: #0000ff;">int<span style="color: #000000;"> capacity) {
    <span style="color: #0000ff;">int oldCapacity =<span style="color: #000000;"> elementData.length;
    <span style="color: #008000;">//<span style="color: #008000;"> 设置新容量是原容量的1.5倍
    <span style="color: #0000ff;">int newCapacity = oldCapacity + (oldCapacity >> 1<span style="color: #000000;">);
    <span style="color: #008000;">//<span style="color: #008000;"> 可能会有一次加入多个数据的情况 那么久直接加到所需容量
    <span style="color: #0000ff;">if (capacity - newCapacity > 0<span style="color: #000000;">)
    newCapacity =<span style="color: #000000;"> capacity;
    elementData =<span style="color: #000000;"> Arrays.copyOf(elementData,newCapacity);
    }

    <span style="color: #0000ff;">public E get(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
    rangeCheck(index);
    <span style="color: #0000ff;">return<span style="color: #000000;"> (E)elementData[index];
    }

    <span style="color: #0000ff;">private <span style="color: #0000ff;">void rangeCheck(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
    <span style="color: #0000ff;">if (index < 0 || index >=<span style="color: #000000;"> size)
    <span style="color: #0000ff;">throw <span style="color: #0000ff;">new IllegalArgumentException("下标越界:" +<span style="color: #000000;"> index);
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">int<span style="color: #000000;"> indexOf(Object o) {
    <span style="color: #0000ff;">if (o == <span style="color: #0000ff;">null<span style="color: #000000;">) {
    <span style="color: #0000ff;">for (<span style="color: #0000ff;">int i = 0; i < size; ++<span style="color: #000000;">i) {
    <span style="color: #0000ff;">if (elementData[i] == <span style="color: #0000ff;">null<span style="color: #000000;">)
    <span style="color: #0000ff;">return<span style="color: #000000;"> i;
    }
    } <span style="color: #0000ff;">else<span style="color: #000000;"> {
    <span style="color: #0000ff;">for (<span style="color: #0000ff;">int i = 0; i < size; ++<span style="color: #000000;">i) {
    <span style="color: #0000ff;">if<span style="color: #000000;"> (o.equals(elementData[i]))
    <span style="color: #0000ff;">return<span style="color: #000000;"> i;
    }
    }
    <span style="color: #0000ff;">return -1<span style="color: #000000;">;
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">boolean<span style="color: #000000;"> contains(Object o) {
    <span style="color: #0000ff;">return indexOf(o) >= 0<span style="color: #000000;">;
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">int<span style="color: #000000;"> size() {
    <span style="color: #0000ff;">return<span style="color: #000000;"> size;
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">boolean<span style="color: #000000;"> isEmpty() {
    <span style="color: #0000ff;">return size == 0<span style="color: #000000;">;
    }

    <span style="color: #0000ff;">public E remove(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
    rangeCheck(index);
    E value =<span style="color: #000000;"> (E)elementData[index];
    <span style="color: #0000ff;">int moveSize = size - index - 1<span style="color: #000000;">;
    <span style="color: #0000ff;">if (moveSize > 0<span style="color: #000000;">)
    System.arraycopy(elementData,index + 1<span style="color: #000000;">,moveSize);
    elementData[--size] = <span style="color: #0000ff;">null<span style="color: #000000;">;
    <span style="color: #0000ff;">return<span style="color: #000000;"> value;
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">boolean<span style="color: #000000;"> remove(Object o) {
    <span style="color: #0000ff;">int index =<span style="color: #000000;"> indexOf(o);
    <span style="color: #0000ff;">if (index < 0<span style="color: #000000;">) {
    <span style="color: #0000ff;">return <span style="color: #0000ff;">false<span style="color: #000000;">;
    } <span style="color: #0000ff;">else<span style="color: #000000;"> {
    remove(index);
    <span style="color: #0000ff;">return <span style="color: #0000ff;">true<span style="color: #000000;">;
    }
    }

    <span style="color: #0000ff;">public Iterator<span style="color: #000000;"> iterator() {
    <span style="color: #0000ff;">return <span style="color: #0000ff;">new<span style="color: #000000;"> Itr();
    }

    <span style="color: #0000ff;">private <span style="color: #0000ff;">class Itr <span style="color: #0000ff;">implements Iterator<span style="color: #000000;"> {

     </span><span style="color: #0000ff;"&gt;int</span> cursor = 0;            <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 下一个将返回的元素</span>

    <span style="color: #000000;">
    @Override
    <span style="color: #0000ff;">public <span style="color: #0000ff;">boolean<span style="color: #000000;"> hasNext() {
    <span style="color: #0000ff;">return cursor !=<span style="color: #000000;"> size;
    }

     @Override
     </span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; E next() {
         </span><span style="color: #0000ff;"&gt;if</span> (cursor < 0 || cursor >=<span style="color: #000000;"&gt; size)
             </span><span style="color: #0000ff;"&gt;throw</span> <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; NoSuchElementException();
         Object[] elementData </span>= ArrayListDemo.<span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;.elementData;
         </span><span style="color: #0000ff;"&gt;return</span> (E)elementData[cursor++<span style="color: #000000;"&gt;];
     }

    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
    ArrayListDemo list = <span style="color: #0000ff;">new ArrayListDemo<span style="color: #000000;">();
    list.add("1"<span style="color: #000000;">);
    list.add("2"<span style="color: #000000;">);
    list.add("3"<span style="color: #000000;">);
    System.out.println(list.get(0<span style="color: #000000;">));
    System.out.println(list.get(1<span style="color: #000000;">));
    System.out.println(list.get(2<span style="color: #000000;">));
    System.out.println(list.indexOf("3"<span style="color: #000000;">));
    System.out.println(list.remove("3"<span style="color: #000000;">));
    System.out.println(list.contains("3"<span style="color: #000000;">));
    <span style="color: #008000;">//<span style="color: #008000;"> System.out.println(list.get(3));
    Iterator itr =<span style="color: #000000;"> list.iterator();
    <span style="color: #0000ff;">while<span style="color: #000000;"> (itr.hasNext()) {
    System.out.println(itr.next());
    }
    }

}

LinkedList

嗯,就是一个双向链表~

<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.Iterator;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.NoSuchElementException;

<span style="color: #008000;">/**<span style="color: #008000;">

  • <span style="color: #808080;">@author<span style="color: #008000;"> wenr

  • 实现方法:

    • void add(E e)
    • void add(int index,E e)
    • E get(int index)
    • int indexOf(Object o)
    • boolean contains(Object o)
    • E remove(int index)
    • boolean remove(Object o)
    • boolean isEmpty()
    • int size()
    • Iterator iterator()
  • <span style="color: #008000;">*/
    <span style="color: #0000ff;">public <span style="color: #0000ff;">class LinkedListDemo<span style="color: #000000;"> {

    <span style="color: #0000ff;">private <span style="color: #0000ff;">int<span style="color: #000000;"> size;
    Node<span style="color: #000000;"> first;
    Node<span style="color: #000000;"> last;

    <span style="color: #0000ff;">public<span style="color: #000000;"> LinkedListDemo() {
    }

    <span style="color: #008000;">//<span style="color: #008000;"> 添加一个节点在结尾处
    <span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> add(E e) {
    Node l =<span style="color: #000000;"> last;
    Node node = <span style="color: #0000ff;">new Node(e,last,<span style="color: #0000ff;">null<span style="color: #000000;">);
    last =<span style="color: #000000;"> node;
    <span style="color: #0000ff;">if (l == <span style="color: #0000ff;">null<span style="color: #000000;">) {
    first =<span style="color: #000000;"> node;
    } <span style="color: #0000ff;">else<span style="color: #000000;"> {
    l.next =<span style="color: #000000;"> node;
    }
    size++<span style="color: #000000;">;
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">void add(<span style="color: #0000ff;">int<span style="color: #000000;"> index,E e) {
    rangeCheckForAdd(index);
    <span style="color: #0000ff;">if (index ==<span style="color: #000000;"> size) {
    add(e);
    } <span style="color: #0000ff;">else<span style="color: #000000;"> {
    Node x =<span style="color: #000000;"> node(index);
    addBeforeNode(e,x);
    }
    }

    <span style="color: #0000ff;">private <span style="color: #0000ff;">void rangeCheckForAdd(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
    <span style="color: #0000ff;">if (index < 0 || index ><span style="color: #000000;"> size)
    <span style="color: #0000ff;">throw <span style="color: #0000ff;">new IndexOutOfBoundsException("下标越界:" +<span style="color: #000000;"> index);
    }

    <span style="color: #0000ff;">private <span style="color: #0000ff;">void addBeforeNode(E e,Node<span style="color: #000000;"> beforeNode) {
    Node preNode =<span style="color: #000000;"> beforeNode.prev;
    Node newNode = <span style="color: #0000ff;">new<span style="color: #000000;"> Node(e,preNode,beforeNode);
    <span style="color: #0000ff;">if (preNode == <span style="color: #0000ff;">null<span style="color: #000000;">) {
    first =<span style="color: #000000;"> newNode;
    } <span style="color: #0000ff;">else<span style="color: #000000;"> {
    preNode.next =<span style="color: #000000;"> newNode;
    }
    beforeNode.prev =<span style="color: #000000;"> newNode;
    size++<span style="color: #000000;">;
    }

    <span style="color: #0000ff;">private Node node(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
    <span style="color: #008000;">//<span style="color: #008000;"> 如果node在前一半就正向查找 否则逆向查找
    <span style="color: #0000ff;">if (index < (size >> 1<span style="color: #000000;">)) {
    Node cursor =<span style="color: #000000;"> first;
    <span style="color: #0000ff;">for (<span style="color: #0000ff;">int i = 0; i < index; ++<span style="color: #000000;">i) {
    cursor =<span style="color: #000000;"> cursor.next;
    }
    <span style="color: #0000ff;">return<span style="color: #000000;"> cursor;
    } <span style="color: #0000ff;">else<span style="color: #000000;"> {
    Node cursor =<span style="color: #000000;"> last;
    <span style="color: #0000ff;">for (<span style="color: #0000ff;">int i = size-1; i > index; --<span style="color: #000000;">i) {
    cursor =<span style="color: #000000;"> cursor.prev;
    }
    <span style="color: #0000ff;">return<span style="color: #000000;"> cursor;
    }
    }

    <span style="color: #0000ff;">public E get(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
    rangeCheck(index);
    Node x =<span style="color: #000000;"> node(index);
    <span style="color: #0000ff;">return<span style="color: #000000;"> x.item;
    }

    <span style="color: #0000ff;">private <span style="color: #0000ff;">void rangeCheck(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
    <span style="color: #0000ff;">if (index < 0 || index >=<span style="color: #000000;"> size)
    <span style="color: #0000ff;">throw <span style="color: #0000ff;">new IndexOutOfBoundsException("数组越界:" +<span style="color: #000000;"> index);
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">int<span style="color: #000000;"> indexOf(Object o) {
    <span style="color: #0000ff;">int index = 0<span style="color: #000000;">;
    <span style="color: #0000ff;">if (o == <span style="color: #0000ff;">null<span style="color: #000000;">) {
    <span style="color: #0000ff;">for (Node x = first; x != <span style="color: #0000ff;">null; x =<span style="color: #000000;"> x.next) {
    <span style="color: #0000ff;">if (x.item == <span style="color: #0000ff;">null<span style="color: #000000;">)
    <span style="color: #0000ff;">return<span style="color: #000000;"> index;
    index++<span style="color: #000000;">;
    }
    } <span style="color: #0000ff;">else<span style="color: #000000;"> {
    <span style="color: #0000ff;">for (Node x = first; x != <span style="color: #0000ff;">null; x =<span style="color: #000000;"> x.next) {
    <span style="color: #0000ff;">if<span style="color: #000000;"> (o.equals(x.item))
    <span style="color: #0000ff;">return<span style="color: #000000;"> index;
    index++<span style="color: #000000;">;
    }
    }
    <span style="color: #0000ff;">return -1<span style="color: #000000;">;
    }

    <span style="color: #0000ff;">public E remove(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
    rangeCheck(index);

     Node</span><E> x =<span style="color: #000000;"&gt; node(index);
     </span><span style="color: #0000ff;"&gt;final</span> E element =<span style="color: #000000;"&gt; x.item;
     </span><span style="color: #0000ff;"&gt;final</span> Node<E> prev =<span style="color: #000000;"&gt; x.prev;
     </span><span style="color: #0000ff;"&gt;final</span> Node<E> next =<span style="color: #000000;"&gt; x.next;
    
     </span><span style="color: #0000ff;"&gt;if</span> (prev == <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) {
         first </span>=<span style="color: #000000;"&gt; next;
     } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
         prev.next </span>=<span style="color: #000000;"&gt; next;
         x.prev </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;
     }
    
     </span><span style="color: #0000ff;"&gt;if</span> (next == <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) {
         last </span>=<span style="color: #000000;"&gt; prev;
     } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
         next.prev </span>=<span style="color: #000000;"&gt; prev;
         x.next </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;
     }
    
     x.item </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;
     size</span>--<span style="color: #000000;"&gt;;
     </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; element;

    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">boolean<span style="color: #000000;"> remove(Object o) {
    <span style="color: #0000ff;">int index =<span style="color: #000000;"> indexOf(o);
    <span style="color: #0000ff;">if (index < 0<span style="color: #000000;">)
    <span style="color: #0000ff;">return <span style="color: #0000ff;">false<span style="color: #000000;">;
    remove(index);
    <span style="color: #0000ff;">return <span style="color: #0000ff;">true<span style="color: #000000;">;
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">int<span style="color: #000000;"> size() {
    <span style="color: #0000ff;">return<span style="color: #000000;"> size;
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">boolean<span style="color: #000000;"> isEmpty() {
    <span style="color: #0000ff;">return size == 0<span style="color: #000000;">;
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">boolean<span style="color: #000000;"> contains(Object o) {
    <span style="color: #0000ff;">return indexOf(o) >= 0<span style="color: #000000;">;
    }

    <span style="color: #0000ff;">public Iterator<span style="color: #000000;"> iterator() {
    <span style="color: #0000ff;">return <span style="color: #0000ff;">new<span style="color: #000000;"> Itr();
    }

    <span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">class Node<span style="color: #000000;"> {
    E item;
    Node<span style="color: #000000;"> prev;
    Node<span style="color: #000000;"> next;
    <span style="color: #0000ff;">public Node(E item,Node prev,Node<span style="color: #000000;"> next) {
    <span style="color: #0000ff;">this.item =<span style="color: #000000;"> item;
    <span style="color: #0000ff;">this.prev =<span style="color: #000000;"> prev;
    <span style="color: #0000ff;">this.next =<span style="color: #000000;"> next;
    }
    }

    <span style="color: #0000ff;">private <span style="color: #0000ff;">class Itr <span style="color: #0000ff;">implements Iterator<span style="color: #000000;"> {

     </span><span style="color: #0000ff;"&gt;private</span> Node<E><span style="color: #000000;"&gt; cursor;
     </span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; nextIndex;
    
     </span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; Itr() {
         cursor </span>=<span style="color: #000000;"&gt; first;
         nextIndex </span>= 0<span style="color: #000000;"&gt;;
     }
    
     @Override
     </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;boolean</span><span style="color: #000000;"&gt; hasNext() {
         </span><span style="color: #0000ff;"&gt;return</span> nextIndex <<span style="color: #000000;"&gt; size;
     }
    
     @Override
     </span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; E next() {
         </span><span style="color: #0000ff;"&gt;if</span> (!<span style="color: #000000;"&gt;hasNext())
             </span><span style="color: #0000ff;"&gt;throw</span> <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; NoSuchElementException();
         E element </span>=<span style="color: #000000;"&gt; cursor.item;
         cursor </span>=<span style="color: #000000;"&gt; cursor.next;
         nextIndex</span>++<span style="color: #000000;"&gt;;
         </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; element;
     }

    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
    LinkedListDemo list = <span style="color: #0000ff;">new LinkedListDemo<><span style="color: #000000;">();
    list.add("aaaa"<span style="color: #000000;">);
    list.add("bbbb"<span style="color: #000000;">);
    list.add("cccc"<span style="color: #000000;">);
    list.add("dddd"<span style="color: #000000;">);
    System.out.println(list.size());
    System.out.println(list.get(1<span style="color: #000000;">));
    System.out.println(list.get(2<span style="color: #000000;">));
    System.out.println(list.get(0<span style="color: #000000;">));
    System.out.println(list.remove(2<span style="color: #000000;">));
    list.add(3,"eeee"<span style="color: #000000;">);
    System.out.println(list.get(1<span style="color: #000000;">));
    System.out.println(list.get(2<span style="color: #000000;">));
    System.out.println(list.get(3<span style="color: #000000;">));
    System.out.println("_____"<span style="color: #000000;">);
    Iterator itr =<span style="color: #000000;"> list.iterator();
    <span style="color: #0000ff;">while<span style="color: #000000;"> (itr.hasNext()) {
    System.out.println(itr.next());
    }
    }

}

Queue

瞎写的啦哈哈哈

队列先进先出 用循环队列实现 节省空间

当front==tail就是队列为空

因为如果队列全部装满的时候front==tail,和空一样,所以循环队列不能全部装满,至少空出一位

当(tail+1)%capacity==front的时候就是队列满(capacity是队列容量大小

<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.Arrays;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.NoSuchElementException;

<span style="color: #008000;">/**<span style="color: #008000;">

  • <span style="color: #808080;">@author<span style="color: #008000;"> wenr
  • 通过数组实现的循环队列
  • 实现方法:
    • boolean offer(E)
    • boolean isEmpty()
    • E peek()
    • E poll()
    • int size()
  • <span style="color: #008000;">*/

<span style="color: #0000ff;">public <span style="color: #0000ff;">class QueueDemo<span style="color: #000000;"> {

</span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;final</span> <span style="color: #0000ff;"&gt;int</span> DEFAULT_SIZE = 0<span style="color: #000000;"&gt;;

</span><span style="color: #0000ff;"&gt;private</span><span style="color: #000000;"&gt; Object[] elementData;
</span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; front;
</span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; tail;

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; QueueDemo() {
    </span><span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;(DEFAULT_SIZE);
}

</span><span style="color: #0000ff;"&gt;public</span> QueueDemo(<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; capacity) {
    elementData </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Object[capacity];
    front </span>= tail = 0<span style="color: #000000;"&gt;;
}

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 向队列中加入一个元素</span>
<span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;boolean</span><span style="color: #000000;"&gt; offer(E element) {
    </span><span style="color: #0000ff;"&gt;int</span> capacity =<span style="color: #000000;"&gt; elementData.length;
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 注意这里是capacity-1哦  因为要区别empty 所以循环队列不能装满的</span>
    <span style="color: #0000ff;"&gt;if</span> (size() == capacity - 1<span style="color: #000000;"&gt;) {
        grow(</span>++<span style="color: #000000;"&gt;capacity);
    }
    elementData[tail] </span>=<span style="color: #000000;"&gt; element;
    tail </span>= (tail + 1) %<span style="color: #000000;"&gt; capacity;
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;;
}

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 获取并移除此队列的头</span>
<span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; E poll() {
    </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (isEmpty())
        </span><span style="color: #0000ff;"&gt;throw</span> <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; NoSuchElementException();
    E element </span>=<span style="color: #000000;"&gt; (E)elementData[front];
    front </span>= (front + 1) %<span style="color: #000000;"&gt; elementData.length;
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; element;
}

</span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;void</span> grow(<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; capacity) {
    </span><span style="color: #0000ff;"&gt;if</span> (capacity == -1<span style="color: #000000;"&gt;)
        </span><span style="color: #0000ff;"&gt;throw</span> <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; OutOfMemoryError();

    </span><span style="color: #0000ff;"&gt;int</span> oldCapacity =<span style="color: #000000;"&gt; elementData.length;
    </span><span style="color: #0000ff;"&gt;int</span> newCapacity = oldCapacity + (oldCapacity >> 1<span style="color: #000000;"&gt;);
    </span><span style="color: #0000ff;"&gt;if</span> (newCapacity <<span style="color: #000000;"&gt; capacity)
        newCapacity </span>=<span style="color: #000000;"&gt; capacity;
    </span><span style="color: #0000ff;"&gt;if</span> (front <<span style="color: #000000;"&gt; tail) {
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; [front...tail]</span>
        elementData =<span style="color: #000000;"&gt; Arrays.copyOf(elementData,newCapacity);
    } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; [...tail front...]</span>
        Object[] tempData = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Object[newCapacity];
        </span><span style="color: #0000ff;"&gt;int</span> moveSize = oldCapacity -<span style="color: #000000;"&gt; front;
        System.arraycopy(elementData,front,tempData,</span>0<span style="color: #000000;"&gt;,moveSize);
        System.arraycopy(elementData,moveSize,tail);
        elementData </span>=<span style="color: #000000;"&gt; tempData;
        tempData </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;
        front </span>= 0<span style="color: #000000;"&gt;;
        tail </span>= oldCapacity - 1<span style="color: #000000;"&gt;;
    }

}

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 获取但不移除此队列的头</span>
<span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; E peek() {
    </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (isEmpty())
        </span><span style="color: #0000ff;"&gt;throw</span> <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; NoSuchElementException();
    </span><span style="color: #0000ff;"&gt;else</span> 
        <span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; (E)elementData[front];
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;boolean</span><span style="color: #000000;"&gt; isEmpty() {
    </span><span style="color: #0000ff;"&gt;return</span> front ==<span style="color: #000000;"&gt; tail;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; size() {
    </span><span style="color: #0000ff;"&gt;int</span> capacity =<span style="color: #000000;"&gt; elementData.length;
    </span><span style="color: #0000ff;"&gt;return</span> (tail - front + capacity) %<span style="color: #000000;"&gt; capacity;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    QueueDemo</span><Integer> q = <span style="color: #0000ff;"&gt;new</span> QueueDemo<>(5<span style="color: #000000;"&gt;);
    q.offer(</span>1<span style="color: #000000;"&gt;);
    q.offer(</span>2<span style="color: #000000;"&gt;);
    q.offer(</span>3<span style="color: #000000;"&gt;);
    q.offer(</span>4<span style="color: #000000;"&gt;);
    System.out.println(q.poll());
    System.out.println(q.poll());
    q.offer(</span>5<span style="color: #000000;"&gt;);
    q.offer(</span>6<span style="color: #000000;"&gt;);
    q.offer(</span>7<span style="color: #000000;"&gt;);
    q.offer(</span>8<span style="color: #000000;"&gt;);
    </span><span style="color: #0000ff;"&gt;while</span> (!<span style="color: #000000;"&gt;q.isEmpty()) {
        System.out.print(q.peek() </span>+ " "<span style="color: #000000;"&gt;);
        q.poll();
    }
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;q.poll();</span>

<span style="color: #000000;"> }
}

Stack

哦 还是瞎写的

栈 先进后出 没什么好说的 都比较简单

<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.Arrays;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.NoSuchElementException;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.Stack;

<span style="color: #008000;">/**<span style="color: #008000;">

  • <span style="color: #808080;">@author<span style="color: #008000;"> wenr

  • 实现函数:

    • E peek()
    • E pop()
    • void push(E)
    • isEmpty()
    • size()
  • <span style="color: #008000;">*/
    <span style="color: #0000ff;">public <span style="color: #0000ff;">class StackDemo<span style="color: #000000;"> {
    <span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">final <span style="color: #0000ff;">int DEFAULT_SIZE = 10<span style="color: #000000;">;
    <span style="color: #0000ff;">private <span style="color: #0000ff;">int<span style="color: #000000;"> top;
    <span style="color: #0000ff;">private<span style="color: #000000;"> Object[] data;

    <span style="color: #0000ff;">public<span style="color: #000000;"> StackDemo() {
    <span style="color: #0000ff;">this<span style="color: #000000;">(DEFAULT_SIZE);
    }

    <span style="color: #0000ff;">public StackDemo(<span style="color: #0000ff;">int<span style="color: #000000;"> capacity) {
    data = <span style="color: #0000ff;">new<span style="color: #000000;"> Object[capacity];
    }

    <span style="color: #0000ff;">public<span style="color: #000000;"> E peek() {
    <span style="color: #0000ff;">if<span style="color: #000000;"> (isEmpty())
    <span style="color: #0000ff;">throw <span style="color: #0000ff;">new<span style="color: #000000;"> NoSuchElementException();
    <span style="color: #0000ff;">return (E)data[top - 1<span style="color: #000000;">];
    }

    <span style="color: #0000ff;">public<span style="color: #000000;"> E pop() {
    <span style="color: #0000ff;">if<span style="color: #000000;"> (isEmpty())
    <span style="color: #0000ff;">throw <span style="color: #0000ff;">new<span style="color: #000000;"> NoSuchElementException();
    <span style="color: #0000ff;">return (E)data[--<span style="color: #000000;">top];
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> push(E e) {
    <span style="color: #0000ff;">int capacity =<span style="color: #000000;"> data.length;
    <span style="color: #0000ff;">if (top ==<span style="color: #000000;"> capacity) {
    grow(capacity + 1<span style="color: #000000;">);
    }
    data[top++] =<span style="color: #000000;"> e;
    }

    <span style="color: #0000ff;">private <span style="color: #0000ff;">void grow(<span style="color: #0000ff;">int<span style="color: #000000;"> capacity) {
    <span style="color: #0000ff;">if (capacity <= 0<span style="color: #000000;">)
    <span style="color: #0000ff;">throw <span style="color: #0000ff;">new<span style="color: #000000;"> OutOfMemoryError();
    <span style="color: #0000ff;">int oldCapacity =<span style="color: #000000;"> data.length;
    <span style="color: #0000ff;">int newCapacity = oldCapacity + (oldCapacity >> 1<span style="color: #000000;">);
    <span style="color: #0000ff;">if (newCapacity <<span style="color: #000000;"> capacity) {
    newCapacity =<span style="color: #000000;"> capacity;
    }
    data =<span style="color: #000000;"> Arrays.copyOf(data,newCapacity);
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">boolean<span style="color: #000000;"> isEmpty() {
    <span style="color: #0000ff;">return top == 0<span style="color: #000000;">;
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">int<span style="color: #000000;"> size() {
    <span style="color: #0000ff;">return<span style="color: #000000;"> top;
    }

    <span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
    StackDemo stack = <span style="color: #0000ff;">new StackDemo<>(3<span style="color: #000000;">);
    stack.push(1<span style="color: #000000;">);
    stack.push(2<span style="color: #000000;">);
    stack.push(3<span style="color: #000000;">);
    stack.push(4<span style="color: #000000;">);
    stack.push(5<span style="color: #000000;">);
    stack.push(6<span style="color: #000000;">);
    stack.pop();
    stack.push(7<span style="color: #000000;">);
    <span style="color: #0000ff;">while (!<span style="color: #000000;">stack.isEmpty()) {
    System.out.println(stack.peek());
    stack.pop();
    }
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读