队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为对头。 队列的链接存储称为链队列。链队列在单链表的基础上作了简单的修改,为了是空队列和费空队列操作一致,给链队列加上头节点。
节点代码:
public class Node <T>{
private T data; //数据
private Node<T> next; //下一个节点的引用
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Node<T> getNext() {
return next;
}
public void setNext(Node<T> next) {
this.next = next;
}
}
链队列代码:
package com.dhy.linkqueue;
/**
* 链队列
* @author Administrator
*
*/
public class LinkQueue <T>{
private Node<T> head; //头指针
private Node<T> rear; //尾指针
/**
* 初始化
*/
public LinkQueue(){
head = new Node<T>();
rear = head;
}
/**
* 入队
* @param e
* @return
*/
public boolean enQueue(T e){
Node<T> s = new Node<T>();
s.setData(e);
rear.setNext(s);
rear = s;
return true;
}
/**
* 出队
* @return
*/
public T deQueue(){
if(head == rear)
throw new RuntimeException("队列已空!");
T e = head.getNext().getData();
head.setNext(head.getNext().getNext());
if(head.getNext() == null) //删除最后一个节点
rear = head;
return e;
}
/**
* 获取队头元素
* @return
*/
public T get(){
if(head == rear)
throw new RuntimeException("队列已空!");
T e = head.getNext().getData();
return e;
}
/**
* 判断队列是否为空
* @return
*/
public boolean isEmpty(){
if(head.getNext() == null)
return true;
else
return false;
}
/**
* 遍历
*/
@Override
public String toString(){
String str = "[";
Node<T> s = head;
while(s != rear){
s = s.getNext();
if(s == rear)
str += s.getData();
else
str += s.getData() + ",";
}
str += "]";
return str;
}
}