下面是代码实现:
public class LinkQueue {
private class Node{
private T data;
private Node next;
@SuppressWarnings("unused")
public Node(){}
public Node(T element, Node next){
this.data = element;
this.next = next;
}
}
//代表链式队列的大小
private int size;
//链式队列的链队首
private Node front;
//链式队列的链队尾
private Node rear;
public LinkQueue(){
size = 0;
front = null;
rear = null;
}
public LinkQueue(T element){
rear = new Node(element, null);
front = rear;
size ++;
}
//返回链式队列的长度
public int length(){
return size;
}
//判断队列是否为空
public boolean isEmpty(){
return size == 0;
}
//向rear端队尾插入元素
public void add(T element){
if(isEmpty()){
rear = new Node(element, null);
front = rear;
}else{
rear.next = new Node(element, null);
rear = rear.next;
}
size ++;
}
//从front端队首移除元素
public T remove(){
exceptionForRemove();
Node oldNode = front;
front = front.next;
oldNode.next = null;
size --;
return oldNode.data;
}
//返回链式队列的堆首元素,但不删除
public T element(){
return front.data;
}
//清空链式队列
public void clear(){
front = null;
rear = null;
size = 0;
}
//toString 方法
public String toString(){
if(isEmpty()){
return "[]";
}else{
StringBuffer sb = new StringBuffer("[");
for(Node current = front; current != null; current = current.next){
sb.append(current.data.toString() + ",");
}
return sb.toString().substring(0, sb.length() - 1) + "]";
}
}
private void exceptionForRemove(){
if(isEmpty()){
throw new IndexOutOfBoundsException("链式队列为空异常");
}
}
}
测试代码如下:
import com.yc.list.LinkQueue;
public class LinkQueueTest {
public static void main(String[] args) {
LinkQueue queue = new LinkQueue();
queue.add("aaaa");
queue.add("bbbb");
queue.add("cccc");
System.out.println( "链式队列为: " + queue);
System.out.println();
System.out.println( "移除队首元素: " + queue.remove());
System.out.println( "链式队列为: " + queue);
System.out.println();
queue.add("dddd");
queue.add("eeee");
System.out.println( "添加 dddd和 eeee链式队列为: " + queue);
System.out.println( "此时队首元素为:" + queue.element());
}
}
测试结果为:
上面创建了一个链队列,但不会出现队列“”满“”的情形,因此程序可以不受限制的向链队列中添加元素。
JAVA集合中的队列:
从JDK 1.5开始,java的集合框架提供了一个Queue接口,该接口代表了一个队列。实现该接口或者实现继承了该接口的类可以当做队列来使用。Queue里包含了 6 个方法,用于代表队列
所包含的3个标志性方法,如下所示:Java为上面每个方法都提供了两个版本:具有特殊返回值的版本和抛出异常的版本。这样就产生了 6 个方法。关于Queue接口里定义的 6 个方法的说明如下表所示:
抛出异常的版本 | 具有特殊返回值的版本 | |
插入 | add(e) | offer(e) |
移除 | remove() | poll() |
访问 | element() | peek() |
Java提供了一个Queue接口,JDK 1.5还为Queue接口提供了一个Deque接口,这个接口代表另外一种特殊的队列--双端队列。
双端队列(有英文单词Deque代表)代表一种特殊的队列,他可以在两端同时进行插入、删除操作。如下图所示: