数据结构中的队列(queue),是一种先进先出的线性表,在java锁,并发处理上有着极其重要的作用,让我们来探究一下队列的实现原理。
queue中有着头结点和尾节点,当新增put队列值的时候需要尾节点指针加一,头结点不变,当从队列中取值的时候,头结点出队
并移动头结点的指针。
/**
* Created on 2018/8/9.
*/
public class FIFOQueue {
// 初始化队列
public static void initQueue(LinkQueue queue) {
// 初始化头结点和尾节点
queue.front = queue.rear = new Node();
// 将他们的下一个指针置为空
queue.front.next = null;
}
// 入队(name可以是任意一个对象,只要是想入队的都可以。)
public static void put(LinkQueue queue, String name) {
// 新建一个节点来存储需要入队的信息
Node p = new Node();
// 将节点信息赋值
p.name = name;
// 将新加节点的下一个节点置为空
p.next = null;
// 将新建的节点加入的队列的尾部
queue.rear.next = p;
// 修改尾节点的指针
queue.rear = p;
}
// 队列出队(头结点出队列)
public static String get(LinkQueue queue) {
// 判断是否为空队列,如果为空队列,返回error
if (queue.front == queue.rear) {
return "error";
}
Node p = new Node();
// 获取头结点的指针
p = queue.front.next;
// 获取到将要出队列的值
String e = p.name;
// 修改头指针,节点出队完成
queue.front.next = p.next;
if (queue.rear == p) {
queue.rear = queue.front;
}
return e;
}
public static void main(String[] args) {
LinkQueue queue = new LinkQueue();
initQueue(queue);
for (int i = 0; i < 10; i++) {
put(queue,"节点" + i);
}
// 入队10次,出队11次,会有一次报错
for (int i = 0; i < 11; i++)
System.out.println(get(queue));
}
}
class Node {
// 任意一个object
String name;
// 节点下一个指针
Node next;
}
class LinkQueue {
// 头结点
Node front;
// 尾节点
Node rear;
}