class Deque {
private Node front, rear;
private int counter;
public Deque() {
front = null;
rear = null;
counter = 0;
}
public void push(Object x) {
if (front==null) {
Node T = new Node(x, null, null);
rear = T;
front = T;
counter++;
} else {
Node T = new Node(x, front, null);
front.next=T;
front = T;
counter++;
}
}
public Object pop() {
if (counter==0) {
return null;
} else if (counter==1) {
counter=0;
Object x = front.data;
rear = null;
front = null;
return x;
}
else {
Object x = front.data;
front=front.prev;
rear.prev = front;
counter--;
return x;
}
}
public void inject (Object x) {
if (rear==null) {
Node T = new Node(x, null, null);
rear = T;
front = T;
counter++;
} else {
Node T = new Node(x, null, rear);
rear.prev=T;
rear = T;
counter++;
}
}
public Object eject() {
if (counter==0) {
rear=null;
front=null;
return null;
} else if (counter==1) {
counter=0;
Object x = rear.data;
rear=null;
front=null;
return x;
}
else {
Object x = rear.data;
rear=rear.next;
front.next = rear;
counter--;
return x;
}
}
class Node {
Node prev;
Node next;
Object data;
Node(Object d, Node p, Node n) {
next = n;
prev = p;
data = d;
}
}
}