115 lines
2.3 KiB
Java
115 lines
2.3 KiB
Java
package queue;
|
|
|
|
/**
|
|
* @author Doschennikov Nikita (me@fymio.us)
|
|
*/
|
|
public class LinkedQueue extends AbstractQueue {
|
|
|
|
private Node head;
|
|
private Node tail;
|
|
|
|
private static class Node {
|
|
|
|
Object value;
|
|
Node next;
|
|
Node prev;
|
|
|
|
Node(Object value) {
|
|
this.value = value;
|
|
}
|
|
}
|
|
|
|
public LinkedQueue() {
|
|
head = null;
|
|
tail = null;
|
|
}
|
|
|
|
@Override
|
|
public void enqueue(Object element) {
|
|
assert element != null : "Element must not be null";
|
|
Node node = new Node(element);
|
|
if (tail == null) {
|
|
head = tail = node;
|
|
} else {
|
|
node.prev = tail;
|
|
tail.next = node;
|
|
tail = node;
|
|
}
|
|
size++;
|
|
}
|
|
|
|
@Override
|
|
public void push(Object element) {
|
|
assert element != null : "Element must not be null";
|
|
Node node = new Node(element);
|
|
if (head == null) {
|
|
head = tail = node;
|
|
} else {
|
|
node.next = head;
|
|
head.prev = node;
|
|
head = node;
|
|
}
|
|
size++;
|
|
}
|
|
|
|
@Override
|
|
public Object element() {
|
|
assert size > 0 : "Queue is empty";
|
|
return head.value;
|
|
}
|
|
|
|
@Override
|
|
public Object peek() {
|
|
assert size > 0 : "Queue is empty";
|
|
return tail.value;
|
|
}
|
|
|
|
@Override
|
|
public Object dequeue() {
|
|
assert size > 0 : "Queue is empty";
|
|
Object result = head.value;
|
|
head = head.next;
|
|
if (head != null) {
|
|
head.prev = null;
|
|
} else {
|
|
tail = null;
|
|
}
|
|
size--;
|
|
return result;
|
|
}
|
|
|
|
@Override
|
|
public Object remove() {
|
|
assert size > 0 : "Queue is empty";
|
|
Object result = tail.value;
|
|
tail = tail.prev;
|
|
if (tail != null) {
|
|
tail.next = null;
|
|
} else {
|
|
head = null;
|
|
}
|
|
size--;
|
|
return result;
|
|
}
|
|
|
|
@Override
|
|
protected Object get(int i) {
|
|
Node cur = head;
|
|
for (int j = 0; j < i; j++) {
|
|
cur = cur.next;
|
|
}
|
|
return cur.value;
|
|
}
|
|
|
|
@Override
|
|
protected void clearImpl() {
|
|
head = null;
|
|
tail = null;
|
|
}
|
|
|
|
@Override
|
|
protected AbstractQueue createEmpty() {
|
|
return new LinkedQueue();
|
|
}
|
|
}
|