队列
队列是一种基于先进先出(FIFO)的数据结构,是一种只能在一端进行插入,在另一端进行删除操作的特殊线性表,它按照先进先出的原则存储数据,先进入的数据,在读取数据时先读被读出来。
队列的API设计
方法名 | 方法功能 |
---|---|
public boolean isEmpty() | 判断队列是否为空,是返回true,否返回false |
public int size() | 获取队列中元素的个数 |
public T dequeue() | 从队列中拿出一个元素 |
public void enqueue(T t) | 往队列中插入一个元素 |
队列的实现
/**
* 队列--单链表实现
*/
public class Queue<T> implements Iterable<T> {
// 记录首结点
private Node head;
// 记录尾结点
private Node last;
// 记录元素个数
private int N;
public Queue() {
head = new Node(null, null);
last = null;
N = 0;
}
// 判断队列是否为空
public boolean isEmpty() {
return N == 0;
}
// 返回队列中元素的个数
public int size() {
return N;
}
// 向队列中插入元素t(尾插法)
public void enqueue(T t) {
// 判断队列是否为空
if (isEmpty()) {
last = new Node(t, null);
head.next = last;
} else {
// 记录当前的尾结点
Node oldLast = last;
// 记录新的尾结点
last = new Node(t, null);
// 链接新的尾结点
oldLast.next = last;
}
// 元素个数+1
N++;
}
// 从队列中拿出一个元素
public T dequeue() {
// 判断队列是否为空
if (isEmpty()) {
return null;
}
// 记录当前第一个结点
Node oldFirst = head.next;
// 头结点指向新的第一个结点
head.next = oldFirst.next;
// 元素个数-1
N--;
return oldFirst.item;
}
private class Node {
private T item;
private Node next;
public Node(T item, Node next) {
this.item = item;
this.next = next;
}
}
@Override
public Iterator<T> iterator() {
return new QIterator();
}
private class QIterator implements Iterator<T> {
private Node n;
public QIterator() {
n = head;
}
@Override
public boolean hasNext() {
return n.next != null;
}
@Override
public T next() {
n = n.next;
return n.item;
}
}
}