Java雙端隊列Deque

鏈表實現

import java.util.Iterator;
public class Deque<Item> implements Iterable<Item> {
    private class Node {
        Item item;
        Node next;
        Node pre;
    }
    private class QueueIterator implements Iterator<Item> {
        public boolean hasNext() {
            return current != null;
        }
        public Item next() {
            Item tmp = current.item;
            current = current.next;
            return tmp;
        }
        private Node current = front;
    }
    public Iterator<Item> iterator() {
        return new QueueIterator();
    }
    boolean isEmtpy() {
        return front == null;
    }
    int size() {
        return n;
    }
    void pushLeft(Item x) {
        Node oldfront = front;
        front = new Node();
        front.item = x;
        front.next = oldfront;
        front.pre = null;
        if(oldfront == null)
            rear = front;
        else
            oldfront.pre = front;
        n++;
    }
    void pushRight(Item x) {
        Node oldrear = rear;
        rear = new Node();
        rear.item = x;
        rear.next = null;
        rear.pre = oldrear;
        if(oldrear != null)
            oldrear.next = rear;
        else
            front = rear;
        n++;
    }
    Item popLeft() {
        if(isEmtpy())
            return null;
        Item tmp = front.item;
        front = front.next;
        if(front == null)
            rear = null;
        else
            front.pre = null;
        n--;
        return tmp;
    }
    Item popRight() {
        if(isEmtpy())
            return null;
        Item tmp = rear.item;
        rear = rear.pre;
        if(rear != null)
            rear.next = null;
        else
            front = null;
        n--;
        return tmp;
    }
    private Node front;
    private Node rear;
    int n;
}

動態數組調整實現

import java.util.Iterator;
public class ResizingArrrayDeque<Item> implements Iterable<Item> {
    private class DequeueIterator implements Iterator<Item> {
        public boolean hasNext() {
            return current < rear;
        }
        public Item next() {
            return array[current++];
        }
        private int current = front;
    }
    public Iterator<Item> iterator() {
        return new DequeueIterator();
    }
    public ResizingArrrayDeque() {
        array = (Item[]) new Object[max];
        n = max;
        front = n / 2;
        rear = front;
    }
    public ResizingArrrayDeque(int size) {
        if(size < 3) {
            array = (Item[]) new Object[max];
            n = max;
        }
        else {
            array = (Item[]) new Object[size];
            n = size;
        }
        front = n / 2;
        rear = front;
    }
    boolean isEmpty() {
        return n == 0;
    }
    private void resize(int len) {
        Item[] tmp = (Item[]) new Object[len];
        int i, j;
        for(i = len / 2 - n / 2, j = front; j <= rear; i++, j++)
            tmp[i] = array[j];
        front = len / 2 - n / 2;
        rear = i - 1;
        array = tmp;
    }
    public void pushLeft(Item x) {
        if(front - 1 < 0)
            resize(2 * array.length);
        array[--front] = x;
        size++;
    }
    public void pushRight(Item x) {
        if(rear + 1 >= n)
            resize(2 * array.length);
        array[rear++] = x;
        size++;
    }
    public Item popLeft() {
        if(isEmpty())
            return null;
        size--;
        Item tmp = array[front++];
        if(front == rear)
            rear++;
        return tmp;
    }
    public Item popRight() {
        if(isEmpty())
            return null;
        size--;
        Item tmp = array[--rear];
        if(rear == front)
            rear++;
        return tmp;
    }
    private Item[] array;
    private int n;
    private int front;
    private int rear;
    private int size;
    private final int max = 50;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章