双向链表实现的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;
}
}
}