队列(JAVA)

简介: 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的性质。


队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的性质。


入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头


在JAVA中队列和栈不同Stack是一个类,Queue是个接口,底层是通过链表实现的

image.png

队列有以下的方法

方法 功能
boolean offer(E e) 入队列
E poll() 出队列
peek() 获取队头元素
int size() 获取队列中有效元素个数
boolean isEmpty() 检测队列是否为空


因为Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。


Queue<Integer>queue1=newLinkedList<>();
Queue<Integer>queue2=newLinkedList<>();

image.gif

循环队列

循环队列就类似将一个数组卷起来变成一个圆环。

image.png

可是这也出现了一些问题比如如何判断队列是空还是满?

有三种解决方法:

    1. 通过添加 size 属性记录
    2. 保留一个位置
    3. 使用标记

    还有一个问题就是如果发生下面这种情况,我们此时还想再插入一个元素。如何让end指向下标为0的区域呢?

    image.png

    解决方法就是:

    (1 + 尾指针所指下标)% 队列长度

    代码实现:

    classMyCircularQueue {
    int[] queue;
    intfront=0;
    intend=0;
    publicMyCircularQueue(intk) {
    queue=newint[k+1];
        }
    publicbooleanenQueue(intvalue) {
    if (isFull()) {
    returnfalse;
            }
    queue[end] =value;
    end= (end+1)%queue.length;
    returntrue;
        }
    publicbooleandeQueue() {
    if (isEmpty()) {
    returnfalse;
            }
    front= (front+1)%queue.length;
    returntrue;
        }
    publicintFront() {
    if (isEmpty()) {
    return-1;
            }
    returnqueue[front];
        }
    publicintRear() {
    if (isEmpty()) {
    return-1;
            }
    returnqueue[(end-1+queue.length)%queue.length];
        }
    publicbooleanisEmpty() {
    returnfront==end;
        }
    publicbooleanisFull() {
    return (end+1) %queue.length==front;
        }
    }

    image.gif


    目录
    相关文章
    |
    1月前
    |
    存储 安全 Java
    【用Java学习数据结构系列】探索栈和队列的无尽秘密
    【用Java学习数据结构系列】探索栈和队列的无尽秘密
    31 2
    |
    2月前
    |
    Java API 容器
    JAVA并发编程系列(10)Condition条件队列-并发协作者
    本文通过一线大厂面试真题,模拟消费者-生产者的场景,通过简洁的代码演示,帮助读者快速理解并复用。文章还详细解释了Condition与Object.wait()、notify()的区别,并探讨了Condition的核心原理及其实现机制。
    |
    1月前
    |
    存储 算法 Java
    【用Java学习数据结构系列】用堆实现优先级队列
    【用Java学习数据结构系列】用堆实现优先级队列
    31 0
    |
    3月前
    |
    Java
    java中的队列
    这篇文章通过Java代码示例介绍了使用数组实现队列操作,包括队列的初始化、入队、出队、判断队列满和空以及遍历队列的方法。
    java中的队列
    |
    4月前
    |
    设计模式 安全 Java
    Java面试题:请解释Java中的线程池以及为什么要使用线程池?请解释Java中的内存模型以及如何避免内存泄漏?请解释Java中的并发工具包以及如何实现一个简单的线程安全队列?
    Java面试题:请解释Java中的线程池以及为什么要使用线程池?请解释Java中的内存模型以及如何避免内存泄漏?请解释Java中的并发工具包以及如何实现一个简单的线程安全队列?
    44 1
    |
    5月前
    |
    Java 开发者
    揭秘!LinkedList是如何华丽变身成为Java队列之王的?
    【6月更文挑战第18天】Java的`LinkedList`既是列表也是队列之星,实现`Queue`接口,支持FIFO操作。其内部的双向链表结构确保了添加/移除元素的高效性(O(1)),适合作为队列使用。它线程不安全,但可通过同步包装用于多线程环境。此外,`LinkedList`还能灵活变身栈或双端队列,提供多种数据结构功能。
    59 11
    |
    5月前
    |
    Java
    2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
    2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
    39 1
    |
    5月前
    |
    安全 Java
    Java Queue新玩法:用LinkedList打造高效队列,让你的代码飞起来!
    【6月更文挑战第18天】Java集合框架中的`LinkedList`不仅是列表,还可作为高效队列。由于其在链表两端进行添加/移除操作的时间复杂度为O(1),故适合实现并发环境下的任务队列。通过案例展示了如何创建、添加任务及确保线程安全,揭示了`LinkedList`提升代码性能的秘密,特别是在多线程应用中的价值。
    51 4
    |
    5月前
    |
    安全 Java 调度
    Java Queue深度解析:LinkedList为何成为队列的最佳实践?
    【6月更文挑战第18天】Java的`LinkedList`适合作为队列,因其双向链表结构支持O(1)的头尾操作。非线程安全的`LinkedList`在单线程环境下效率高,多线程时可通过`Collections.synchronizedList`封装。此外,它还可兼做栈和双端队列,提供任务调度的高效解决方案。
    66 3
    |
    4月前
    |
    设计模式 安全 NoSQL
    Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
    Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
    71 0
    下一篇
    无影云桌面