import java.util.concurrent.atomic.AtomicReference;
public class LinkedQueue<E> {
/**
* 定义一个原子化结点结构体
*/
private static class Node<E> {
final E item;
final AtomicReference<Node<E>> next;
Node(E item, Node<E> next) {
this.item = item;
this.next = new AtomicReference<Node<E>>(next);
}
}
/**
* 空链表都是头结点指向假结点(item和下一个结点都是null),尾结点=头结点。
*/
private AtomicReference<Node<E>> head = new AtomicReference<Node<E>>(
new Node<E>(null, null));
private AtomicReference<Node<E>> tail = head;
public boolean put(E item) {
Node<E> newNode = new Node<E>(item, null);
while (true) {
Node<E> curTail = tail.get();
Node<E> residue = curTail.next.get();
/**
* 如果当前结点是尾结点,则进行插入,否则不进行处理
*/
if (curTail == tail.get()) {
/**
* 判断是否正在插入,如果正在插入尾结点的下个结点residue=curTail.next.get()
* 是不为null的。compareAndSet作用为如果值等于第一个参数就把值赋为第二个参数
*/
if (residue == null) /* A */{
/**
* 如果尾结点的下个结点为null即当前无插入操作则进行插入,
* 插入完成后把当前结点作为新的尾结点,
* 返回true表示插入成功。
*/
if (curTail.next.compareAndSet(null, newNode)) /* C */{
tail.compareAndSet(curTail, newNode) /* D */;
return true;
}
} else {
/**
* 如果尾结点不为null,说明有其他进程或线程正在执行到C和D之间.但D还没执行到,
* 这时候反正已经C执行完了,直接把当前结点的下一个结点赋值为尾结点,帮它快点结束
*/
tail.compareAndSet(curTail, residue) /* B */;
}
}
}
}
public static void main(String[] args) {
LinkedQueue lq=new LinkedQueue();
lq.put("aaa");
lq.put("bbb");
lq.put("ccc");
lq.put("ddd");
lq.put("eee");
lq.put("fff");
lq.put("ggg");
// System.out.println(lq.);
// System.out.println(lq.pop());
// System.out.println(lq.pop());
// System.out.println(lq.pop());
// System.out.println(lq.pop());
// System.out.println(lq.pop());
// System.out.println(lq.pop());
}
}
分享到:
相关推荐
循环链表表示队列是指使用带头结点的循环链表来表示队列,并且只设一个指针指向队尾元素结点。在这种表示方法中,不设头指针,而是使用一个指针指向队尾元素结点。这种方法可以更好地实现队列的插入、删除和遍历操作...
### 只有尾结点的链表表示的队列算法 #### 1. 定义结点和队列结构 本篇文章将介绍一种利用链表实现队列的方法,该方法的特点在于只维护一个指向链表尾部(即队列尾部)的指针。这种方法在某些场景下可以有效地减少...
本话题主要探讨了两种常用的数据结构——数组和链表——在实现队列这一线性数据结构时的应用。队列是一种先进先出(First In First Out, FIFO)的数据结构,它的主要操作包括入队(enqueue)、出队(dequeue)以及...
这两种实现方式均使用了带头结点的循环链表来表示队列,并且只设置了一个指向队尾元素的指针,实现了基本的队列操作如初始化、入队和出队等。通过上述分析,可以清晰地理解如何使用循环链表表示队列以及如何进行基本...
假设以带头结点的循环链表表示一个队列,并且只设一个队尾指针指向尾元素结点(注意不设头指针),试写出相应的置空队、入队、出队的算法。(Java描述)
这些阻塞队列都实现了java.util.concurrent.BlockingQueue接口,提供了如put、take、offer、poll等方法,用于进行元素的插入、移除以及检查操作。它们广泛应用于生产者-消费者模型、线程池的工作队列等并发场景,...
实现队列时,可以结合这些函数以及结构体来定义队列节点和队列本身。 例如,可以定义一个结构体`QueueNode`来表示队列中的节点,包含数据和指向下一个节点的指针: ```c typedef struct QueueNode { int data; ...
根据给定文件的信息,我们可以总结出以下关于C++中链表队列实现的相关知识点: ### 一、链表队列的基本概念 链表队列是一种使用链表结构来实现的队列数据结构。队列是一种先进先出(First In First Out, FIFO)的...
链表队列的实现 链表队列的具体增删改查实现 是一种单链表实现
本话题主要探讨如何使用链表来实现栈和队列这两种基本的数据结构。链表是一种动态数据结构,它允许在运行时添加或删除元素,而无需预先确定其大小。这使得链表成为实现栈和队列的理想选择。 栈是一种后进先出(LIFO...
在计算机科学中,数据结构是组织和管理大量数据的关键元素,而Java作为一种广泛使用的编程语言,提供了丰富的数据结构实现。本篇文章将详细讲解Java中的队列、链表和栈,这些概念是许多初学者和专业人士都需要掌握的...
本话题主要探讨的是如何使用链表来实现队列这一经典数据结构。队列是一种先进先出(First In First Out, FIFO)的数据结构,常用于任务调度、缓存管理和多线程同步等场景。 链表是一种动态数据结构,它不像数组那样...
链表、队列和二叉树是计算机科学中基础且重要的数据结构,它们在实际的软件开发中扮演着至关重要的角色。这篇文档将详细介绍这些数据结构及其应用实现,旨在帮助初学者更好地理解和运用它们。 首先,让我们从链表...
Java中的队列是一种数据结构,它遵循先进先出(FIFO)原则,即最先插入的元素将是最先被删除的。在Java中,队列的实现主要有三种:顺序队列、链式队列和循环队列。下面我们将详细探讨这三种队列的实现方式。 1. **...
本资源提供了带头结点的循环链表表示队列的算法实现,包括队列初始化、入队列和出队列的算法。队列使用一个指针指向队尾元素结点,注意不设头指针。提供了两种答案,第一种答案使用typedef int Datatype和typedef ...
`队列链表.EXE` 和 `堆栈链.EXE` 是编译后的可执行文件,可能用于演示和测试这些数据结构的操作。 学习和理解堆栈和队列的链表实现对理解数据结构和算法至关重要,它们在递归、回溯、任务调度、内存管理等许多领域...
* 基于双向链表实现双端队列结构 */ package dsa; public class Deque_DLNode implements Deque { protected DLNode header;//指向头节点(哨兵) protected DLNode trailer;//指向尾节点(哨兵) protected ...
线性表通常以数组或链表的形式实现,支持插入、删除、查找等基本操作。模板类允许我们编写一次代码,就可以用于多种数据类型,提高了代码的复用性。 2. **链表**:链表是一种动态数据结构,与数组不同,它不连续...
在 Java 中,LinkedList 的内部使用双端链表队列原理实现,而 ArrayList 的内部使用双端数组队列原理实现。 Java 实现自定义双端队列可以通过链表和数组两种方式实现,双端队列可以充当单端队列,也可以用于充当栈...
用循环链表实现队列操作 讲解详细 通过多次编译 可以运行的