本文档编写的队列用的是根据单向链表编写的单向链表改进后编写的。总效果和循环队列是一样的。
接口:
package blacktv.queue;
/**
* 实现队列需要完成的接口
*/
public interface Queue<E> {
/**
* 入队
*
* @param e
*/
public void enqueue(E e);
/**
* 出队,并返回出队的元素,如果队列为空则返回null
*
* @return
*/
public E dequeue();
/**
* 获取队列首部的元素是谁,如果队列为空则返回null
*
* @return
*/
public E getFront();
/**
* 获取队列的大小
*
* @return
*/
public Integer getSize();
/**
* 查看队列是否为空,为空返回true
*
* @return
*/
public Boolean isEmpty();
}
实现类:
package blacktv.queue;
/**
* 用单向链表(改进后)实现队列
*
* @param <E>
*/
public class LinkedListQueue<E> implements Queue<E> {
private Node dummyHead;//虚拟头结点,值为空
private Node tail;//链表末尾的节点
private Integer size;
public LinkedListQueue() {
size = 0;
tail = null;
dummyHead = new Node(null, tail);
}
@Override
public void enqueue(E e) {
//入队进入链表末端
if (tail == null || size == 0) {
tail = new Node(e);
dummyHead.next = tail;
} else {
tail.next = new Node(e);
tail = tail.next;
}
size++;
}
@Override
public E dequeue() {
E e = null;
if (size >= 1) {
//出队从链表首端出
Node buffer = dummyHead.next;
dummyHead.next = dummyHead.next.next;
e = buffer.e;
buffer = null;//让JVM回收
size--;
}
return e;
}
@Override
public E getFront() {
if (size >= 1)
return dummyHead.next.e;
return null;
}
@Override
public Integer getSize() {
return size;
}
@Override
public Boolean isEmpty() {
return size == 0;
}
/**
* 最左边是队列首部
*
* @return
*/
@Override
public String toString() {
String string = "Size:" + size + "\tLinkedListQueue[";
Node buffer = dummyHead.next;
for (Integer i = 0; i < size; i++) {
string += buffer.e;
buffer = buffer.next;
if (i != size - 1)
string += ", ";
}
string += "]";
return string;
}
/**
* 用个内部类编写节点,对使用者屏蔽实现细节
*/
private class Node {
public E e;
public Node next;
public Node(E e) {
this.e = e;
}
public Node(E e, Node next) {
this.e = e;
this.next = next;
}
public Node() {
}
@Override
public String toString() {
return e.toString();
}
}
}