队列是先进先出。其实现可以采用链表实现,也可以采用数组实现。基于数组的实现较为麻烦,需要考虑下标回绕的问题。
基于链表的实现
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* 先进先出队列,基于单向链表的实现
* @author lm
*
* @param <Item>
*/
public class Queue<Item> implements Iterable<Item> {
private Node<Item> first; // beginning of queue
private Node<Item> last; // end of queue
private int n; // number of elements on queue
// helper linked list class
private static class Node<Item> {
private Item item;
private Node<Item> next;
}
/**
* Initializes an empty queue.
*/
public Queue() {
first = null;
last = null;
n = 0;
}
public boolean isEmpty() {
return first == null;
}
public int size() {
return n;
}
/*
* first is the first one to enqueue
* last is the last one to enqueue
*/
public void enqueue(Item item) {
Node<Item> node = new Node<Item>();
node.item = item;
if(this.isEmpty()) {
last = node;
first = node;
} else {
last.next = node;
last = node;
}
n++;
}
public Item dequeue() {
if(this.isEmpty())
throw new NoSuchElementException();
Item item = first.item;
first = first.next;
n--;
if(this.isEmpty())
last = null;
return item;
}
@Override
public Iterator<Item> iterator() {
return new Iterator<Item>() {
private Node<Item> current = first;
@Override
public boolean hasNext() {
return current != null;
}
@Override
public Item next() {
if(!hasNext())
throw new NoSuchElementException();
Item item = current.item;
current = current.next;
return item;
}
};
}
}