Deque.java
import java.util.Iterator;
public class Deque<Item> implements Iterable<Item>{
private class DoubleNode<Item>
{
private DoubleNode<Item> next = null;
private DoubleNode<Item> last = null;
private Item data;
}
private DoubleNode<Item> head = null;
public Deque()
{
}
public boolean isEmpty()
{
return head == null;
}
public int size()
{
if (head == null)
return 0;
DoubleNode<Item> current = head;
int count = 1;
while(current.next != null)
{
++count;
current = current.next;
}
return count;
}
public void pushLeft(Item item)
{
if (head == null)
{
head = new DoubleNode<Item>();
head.data = item;
return;
}
DoubleNode<Item> current = new DoubleNode<Item>();
current.data = item;
current.next = head;
head.last = current;
head = current;
}
public void pushRight(Item item)
{
if (head == null)
{
head = new DoubleNode<Item>();
head.data = item;
return;
}
DoubleNode<Item> current = head;
while (current.next != null)
current = current.next;
current.next = new DoubleNode<Item>();
current.next.data = item;
current.next.last = current;
}
public Item popLeft()
{
if (head == null)
throw new RuntimeException();
Item ret = head.data;
head = head.next;
head.last = null;
return ret;
}
public Item popRight()
{
if (head == null)
throw new RuntimeException();
DoubleNode<Item> current = head;
while (current.next != null)
current = current.next;
Item ret = current.data;
current.last.next = null;
return ret;
}
public Iterator<Item> iterator()
{
return new DequeIterator();
}
private class DequeIterator implements Iterator<Item>
{
private DoubleNode<Item> current = head;
public boolean hasNext()
{
return current != null;
}
public void remove()
{
}
public Item next()
{
Item item = current.data;
current = current.next;
return item;
}
}
}
ResizingArrayDeque.java
import java.util.Iterator;
public class ResizingArrayDeque<Item> implements Iterable<Item>{
private Item[] item;
private int head;
private int tail;
@SuppressWarnings("unchecked")
public ResizingArrayDeque(int cap)
{
item = (Item[])(new Object[cap]);
if (cap <= 1)
throw new RuntimeException();
head = cap / 2;
tail = cap / 2;
}
public boolean isEmpty()
{
return head == tail;
}
public int size()
{
return tail - head;
}
public void resize(int size)
{
@SuppressWarnings("unchecked")
Item[] temp = (Item[])(new Object[size]);
int start = size / 2 - size() / 2;
int end = start + size();
for (int i = start,j = head; i < end; ++i,++j)
temp[i] = item[j];
item = temp;
head = start;
tail = end;
}
public void pushLeft(Item data)
{
if (head == 0)
resize(size() * 3);
item[--head] = data;
}
public void pushRight(Item data)
{
if (tail == item.length)
resize(3 * size());
item[tail++] = data;
}
public Item popLeft()
{
if(isEmpty())
return null;
Item ret = item[head];
item[head++] = null;
return ret;
}
public Item popRight()
{
if (isEmpty())
return null;
Item ret = item[--tail];
item[tail] = null;
return ret;
}
public Iterator<Item> iterator()
{
return new ResizingArrayDequeIterator();
}
public class ResizingArrayDequeIterator implements Iterator<Item>
{
private int current = head;
public boolean hasNext()
{
return current < tail;
}
public void remove()
{
}
public Item next()
{
Item ret = item[current++];
return ret;
}
}
}
测试:main.java
import edu.princeton.cs.algs4.StdOut;
public class Main {
public static void main(String[] args)
{
Deque<Integer> dq = new Deque<Integer>();
for (int i = 5 ; i >= 0; --i)
dq.pushLeft(i);
for (int i = 6; i <= 10; ++i)
dq.pushRight(i);
for (Integer it : dq)
StdOut.print(it + " ");
StdOut.println();
for (int i = 0; i < 5; ++i)
{
StdOut.print(dq.popRight() + " ");
StdOut.print(dq.popLeft() + " ");
}
StdOut.println();
ResizingArrayDeque<Integer> rd = new ResizingArrayDeque<Integer>(11);
for (int i = 5 ; i >= 0; --i)
rd.pushLeft(i);
for (int i = 6; i <= 10; ++i)
rd.pushRight(i);
for (Integer it : rd)
StdOut.print(it + " ");
StdOut.println();
for (int i = 0; i < 5; ++i)
{
StdOut.print(rd.popRight() + " ");
StdOut.print(rd.popLeft() + " ");
}
}
}