这是一个队列的简单实现,同时也实现了Iterable接口。代码较简单,比起JDK自带的队列实现,简直弱爆了。但本人主要是为了复习数据结构而已,个人觉得还是有一定参考价值的,有兴趣的看一看吧。
具体实现代码如下:
import java.util.Iterator;
import java.util.NoSuchElementException;
public class Queue<T> implements Iterable<T> {
private Node<T> first;
private Node<T> last;
private int size;
private static class Node<T> {
private T item;
private Node<T> next;
}
public Queue() {
first = null;
last = null;
size = 0;
}
public boolean isEmpty() {
return first == null;
}
public void enqueue(T t) {
Node<T> oldLast = last;
last = new Node<T>();
last.item = t;
last.next = null;
if (isEmpty()) {
first = last;
} else {
oldLast.next = last;
}
size++;
}
public T dequeue() {
if (isEmpty())
throw new NoSuchElementException("队列为空");
T item = first.item;
first = first.next;
size--;
if (isEmpty())
last = null;
return item;
}
public T peek() {
if (isEmpty())
throw new NoSuchElementException("队列为空");
return first.item;
}
public int size() {
return size;
}
@Override
public Iterator<T> iterator() {
return new QueueIterator<T>(first);
}
/**
* 队列的迭代器实现
*/
private class QueueIterator<T> implements Iterator<T> {
private Node<T> current;
public QueueIterator(Node<T> current) {
this.current = current;
}
@Override
public boolean hasNext() {
return current != null;
}
public void remove() {
throw new UnsupportedOperationException();
}
@Override
public T next() {
if (!hasNext())
throw new NoSuchElementException();
T item = current.item;
current = current.next;
return item;
}
}
public String toString() {
StringBuilder s = new StringBuilder();
for (T item : this)
s.append(item + " -> ");
return s.toString() + null;
}
public static void main(String... args) {
Queue<String> queue = new Queue<String>();
queue.enqueue("I");
queue.enqueue("am");
queue.enqueue("a");
queue.enqueue("hero");
System.out.println(queue);
System.out.println("队列的大小是" + queue.size);
Iterator<String> iterator = queue.iterator();
iterator.forEachRemaining(t -> System.out.println("[ " + t + "]"));
queue.dequeue();
System.out.println(queue);
System.out.println("队列的大小是" + queue.size);
queue.dequeue();
System.out.println(queue);
System.out.println("队列的大小是" + queue.size);
queue.dequeue();
System.out.println(queue);
System.out.println("队列的大小是" + queue.size);
queue.dequeue();
System.out.println(queue);
System.out.println("队列的大小是" + queue.size);
queue.dequeue();
System.out.println(queue);
System.out.println("队列的大小是" + queue.size);
}
}