下面来讨论队列的链式存储,即链队列。
链队列的定义:
队列的链式存储结构简称为链队列。它是限制仅在表头删除和表尾插入的单链表。
链队列的数据存储形式:
链队列基本运算的实现:
/**
*
*/
package unit5Queue.linked;
/**
* 链式队列
* <p>Title: LinkedQueue</p>
* <p>Description: </p>
* <p>Company: </p>
* @author 夏 杰
* @param <T>
* @date 2015年12月16日 下午11:12:31
* @vesion 1.0
*/
public class LinkedQueue<T> {
//队列头指针
public QueueNode<T> font;
//队列头指针
public QueueNode<T> rear;
//队列数据长度
public int size = 0;
/**
* 初始化队列
* @param rear
*/
public LinkedQueue() {
QueueNode<T> node = new QueueNode<T>(null,null);
node.next = null;
font=rear=node;
}
/**
* 入队列
* @param data
*/
public void push(T data){
//创建一个新的节点
QueueNode<T> node = new QueueNode<T>(data,null);
//将新的节点插入队尾(通过rear.next=node 这样连起来)
rear.next = node;
rear = node;
size++;
}
/**
* 出队列
*/
public T pop(){
if(rear == font){
try {
throw new Exception("队列为空");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}else{
//node是将要出队列的节点
//注意font节点是不存储数据的
QueueNode<T> node = font.next;
T data = node.data;
font.next = node.next;
//将要出队列的节点删除掉
node = null;
size--;
return data;
}
}
public boolean isEmpty(){
if(font==rear){
return true;
}
return false;
}
/**
* 队列长队
* @return
* @author WWX
*/
public int size(){
return size;
}
public String toString(){
if(isEmpty()){
return "[]";
}else{
StringBuilder sb = new StringBuilder("[");
for(QueueNode<T> current = font.next;current!=null;current = current.next){
sb.append(current.data.toString() + ",");
}
int len = sb.length();
return sb.delete(len - 2, len).append("]").toString();
}
}
public static void main(String[] args) {
LinkedQueue<Integer> queue = new LinkedQueue<Integer>();
queue.push(1);
queue.push(7);
queue.push(6);
queue.push(34);
queue.push(4);
queue.push(33);
System.out.println(queue);
System.out.println("出队:"+queue.pop());
System.out.println("队列长度="+queue.size());
System.out.println(queue);
}
}