算法4 习题1.3.33 解答

双向链表实现的Deque

import java.util.Iterator;

public class Deque<Item> implements Iterable<Item> {
    private int N;
    private Node first;
    private Node last;

    private class Node {
        Item item;
        Node prev;
        Node next;
    }

    public boolean isEmpty() {
        return N == 0;
    }

    public int size() {
        return N;
    }

    public void pushLeft(Item item) {
        Node newfirst = new Node();
        newfirst.item = item;
        if (N == 0) {
            first = last = newfirst;
        }
        else {
            first.prev = newfirst;
            newfirst.next = first;
            first = newfirst;
        }
        N++;
    }

    public void pushRight(Item item) {
        Node newlast = new Node();
        newlast.item = item;
        if (N == 0) {
            first = last = newlast;
        }
        else {
            last.next = newlast;
            newlast.prev = last;
            last = newlast;
        }
        N++;
    }

    public Item popLeft() {
        if (N == 0) {
            return null;
        }
        else {
            Item e = first.item;
            if (N == 1) {
                first = last = null;
            }
            else {
                first = first.next;
                first.prev.next = null;
                first.prev = null;
            }
            N--;
            return e;
        }
    }

    public Item popRight() {
        if (N == 0) {
            return null;
        }
        else {
            Item e = last.item;
            if (N == 1) {
                first = last = null;
            }
            else {
                last = last.prev;
                last.next.prev = null;
                last.next = null;
            }
            N--;
            return e;
        }
    }

    @Override
    public Iterator<Item> iterator() {
        return new DequeIterator();
    }
    private class DequeIterator implements Iterator<Item> {
        private Node current = first;

        @Override
        public boolean hasNext() {
            return current != null;
        }

        public void remove() {}

        @Override
        public Item next() {
            Item item = current.item;
            current = current.next;
            return item;
        }
    }
}

动态数组调整实现的ResizingArrayDeque

import java.util.Iterator;
import java.util.NoSuchElementException;

public class ResizingArrayDeque<Item> implements Iterable<Item> {
    private Item[] q;
    private int N;


    public ResizingArrayDeque() {
        q = (Item[]) new Object[2];
        N = 0;
    }

    public boolean isEmpty() {
        return N == 0;
    }

    public int size() {
        return N;
    }

    private void resize(int capacity) {
        if ( capacity >= N) {
            Item[] temp = (Item[]) new Object[capacity];
            for (int i = 0; i < N; i++)
                temp[i] = q[i];
            q = temp;
        }
    }

    public void pushLeft(Item item) {
        if (N == q.length) {
            resize(2 * q.length);
        }
        Item[] temp = (Item[]) new Object[N + 1];
        temp[0] = item;
        for (int i = 0; i < N; i++) {
            temp[i + 1] = q[i];
        }
        q = temp;
        N++;
    }

    public void pushRight(Item item) {
        if (N == q.length) {
            resize(2 * q.length);
        }
        q[N] = item;
        N++;
    }

    public Item popLeft() {
        if (N == 0)
            throw new NoSuchElementException("队列下溢");
        Item item = q[0];
        Item[] temp = (Item[]) new Object[N - 1];
        if (temp.length == 0)
            q = null;
        else {
            for (int i = 0; i < N - 1; i++)
                temp[i] = q[i + 1];
            q = temp;
        }
        if (N > 0 && N == q.length / 4)
            resize(q.length / 2);
        N--;
        return item;
    }

    public Item popRight() {
        if (N == 0)
            throw new NoSuchElementException("队列下溢");
        Item item = q[N - 1];
        q[N - 1] = null;
        if (N > 0 && N == q.length / 4)
            resize(q.length / 2);
        N--;
        return item;
    }

    @Override
    public Iterator<Item> iterator() {
        return new RADIterator();
    }
    private class RADIterator implements Iterator<Item> {
        private int current = 0;

        @Override
        public boolean hasNext() {
            return current != N - 1;
        }

        @Override
        public void remove() {}

        @Override
        public Item next() {
            Item item = q[current];
            current++;
            return item;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值