使用链的方式存储节点,而不是使用数组了。
操作还是接口中定义的那些了。在链式的存储方式下,分写类的成员和方法的实现。
package honbaa_queue;
import java.util.Iterator;
public class LinkedQueue<T> implements Queue<T> {
//仍然先定义节点类型
private class Node{
private T data;
private Node next;
}
//成员
private Node head;//对头,同样使用一个空的无意义节点
private Node tail;//队尾
//这里就要加个size了,因为haed和tail没法做减法
private int size;
//构造函数
public LinkedQueue() {
Node node = new Node();
node.data = null;
node.next = null;
//head和tail都指向这个空节点
head = node;
tail = node;
size = 0;
}
@Override
public void enQueue(T element) {
//不存在容量的问题,直接在tail后面加一个新的节点
Node newNode = new Node();
newNode.data = element;
newNode.next = null;
//挂在tail后面
tail.next = newNode;
//tail向后移动,head不动
tail = tail.next;
//size++
size++;
}
@Override
public T outQueue() {
if(size()==0)
try {
throw new Exception("the queueis empty!");
} catch (Exception e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
//head后面的第一个元素除掉。
Node first = head.next;
head.next = first.next;
//size--
size--;
return first.data;
}
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
if(size()==0)
return true;
else
return false;
}
@Override
public Iterator<T> iterator() {
return new LinkedQueueIterator();
}
private class LinkedQueueIterator<t> implements Iterator<T>{
//head处
private Node currentPos = head;
@Override
public boolean hasNext() {
if(currentPos.next != null)
return true;
else
return false;
}
@Override
public T next() {
// 返回下一个
currentPos = currentPos.next;
return currentPos.data;
}
}
public String toString(){
StringBuilder sb =new StringBuilder();
Iterator it = iterator();
while(it.hasNext())
sb.append(it.next()+" ");
return sb.toString();
}
}