数据结构中的队列(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; }