Java通过链表实现队列

时间:2023-02-10 21:49:41
class LinkedQueue<T> {
/**
* 队列大小,由构造函数初始化
*/
private int maxSize; /**
* 队头
*/
private Node front = null; /**
* 队尾
*/
private Node rear = null; /**
* 队列实际元素个数
*/
private int nItems; /**
* 初始化队列,并指定队列长度
*
* @param maxSize
*/
public LinkedQueue(int maxSize) {
this.maxSize = maxSize;
front = null;
rear = null;
this.nItems = 0;
} /**
* 讲一个数据放入队列
*
* @param data
*/
public void enqueue(T data) {
Node node = new Node(data);
if (isEmpty()) {
front = node;
front.next = null;
rear = node;
rear.pre = null;
nItems++;
return;
}
if (size() == 1) {
rear = node;
front.next = rear;
rear.pre = front;
nItems++;
return;
}
if (isFull()) {
System.out.print("超过队列已满,无法入队");
return;
}
node.pre = rear;
rear.next = node;
rear = node;
nItems++;
} /**
* 将数据出队
*
* @return
*/
public T dequeue() {
Node temp = null;
if (isEmpty()) {
System.out.println("队列已空,无法出队");
return null;
}
if (size() == 1) {
temp = front;
front = null;
rear = null;
nItems--;
return temp.data;
}
if (size() == 2) {
temp = front;
front = rear;
front.next = null;
rear.pre = null;
nItems--;
return temp.data;
}
temp = front;
front = front.next;
nItems--;
return temp.data;
} /**
* 判断队列是否为空
*
* @return
*/
public boolean isEmpty() {
return nItems == 0;
} /**
* 判断队列是否已满
*
* @return
*/
public boolean isFull() {
return nItems == maxSize;
} /**
* 获取队列的实际数据个数
*
* @return
*/
public int size() {
return nItems;
} /**
* 将数据封装成节点
*
* @author John
*
*/
private class Node {
T data;
Node next;
Node pre; public Node(T data) {
this.data = data;
}
}
}