队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。(百度百科)
用链表实现一个队列大概就是要有一个头节点,一个尾节点,尾节点取出,头结点插入,要注意的一点是当队列中没有元素时要做特殊处理。
队列可以解决经典的走迷宫问题。
public class LinkedQueue<T> implements Queue<T>{
//队列事尾进头出~~
//大概就是两个变量,一个头部,一个尾部,尾部主要插入,头部主要取出,需要注意的是当没有元素时候要做一些处理
private Node<T> front,rear; //front和rear分别指向头结点和尾节点
public LinkedQueue() {
this.front=this.rear=null; //空队列中开始都为null
}
public boolean isEmpty() {
return this.front==null&&this.rear==null; //如果二者都为空,那就判断为空
}
public boolean add(T x) { //插入x
if(x==null) //如果x为null插入失败
return false;
Node <T> q=new Node<T>(x,null); //中间变量
if(this.front==null)
this.front=q; //空队插入
else this.rear.next=q; //队尾插入
this.rear=q;
return true;
}
public T peek() {
return this.isEmpty()?null:this.front.data;
}
public T poll() {
if(isEmpty()) //如果队列为空直接返回Null
return null;
T x=front.data;
this.front=this.front.next;
if(this.front==null) //如果没有元素了,尾部就也没有了
this.rear=null;
return x;
}
}
class Node<T>{
public Node(T data,Node<T> next) {
this.data=data;
this.next=next;
}
T data;
Node<T> next;
Node<T> front;
}
参考书籍《JAVA数据结构》第四版