java-队列,双端队列、栈

本文详细介绍了Java中Queue与Deque接口的具体使用方法,包括如何进行入队、出队操作,以及如何利用Deque实现栈的功能。通过具体代码示例展示了不同队列操作的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * java.util.Queue 队列,可以存储一组元素,但是存取元素必须遵循先进先出原则 JDK
 * 
 * @author samsung
 *
 */
public class QueueDemo {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<String>();
        /**
         * 入队操作 boolean offer(E e):将一个对象添加到队尾,添加成功返回true
         */
        queue.offer("one");
        queue.offer("two");
        queue.offer("three");
        System.out.println("入队:");
        System.out.println(queue);// [one, two, three]
        /**
         * 出队操作 从队首获取元素,获取后该元素就从队列中给移除 E poll():从队首删除并返回一个元素
         */
        String str = queue.poll();
        System.out.println("出队:");
        System.out.println(str);
        System.out.println(queue);// [two, three]
        /**
         * 获取队首元素 E peek():返回队首元素(但是不删除)
         */
        String str1 = queue.peek();
        System.out.println(str1);
        System.out.println(queue);
        System.out.println("开始遍历");
        for (String e : queue) {
            System.out.println(e + "  ");
        }
        while (queue.size() > 0) {
            System.out.println(queue.poll() + "  ");
        }
        /**
         * java.util.Deque 双端队列 两端都可以进出队列 双端队列接口继承自队列接口(Queue)
         *  boolean offer(E e):将一个对象添加到队尾,添加成功返回true 
         *  boolean offerFirst(E e):将一个对象添加到队首,添加成功返回true boolean offerLast(E e):将一个对象添加到队尾,添加成功返回true
         * 
         * E poll():从队首删除并返回一个元素 E pollFirst():从队首删除并返回一个元素 E
         * pollLast():从队尾删除并返回一个元素
         * 
         * E peek():返回队首元素(但是不删除)
         * 
         */
        Deque<String> deque = new LinkedList<String>();
        deque.offer("a");
        deque.offer("aa");
        deque.offerFirst("b");// 从队首添加
        deque.offerLast("c");// 从队尾添加
        System.out.println(deque);// [b, a, aa, c]
        /**
         * 如果将Deque限制为只能从一端进和出,则可以实现 栈(Stack) 入栈:push(offerFirst)
         * 出栈:pop(pollFirst) 栈遵循先进后出(FILO)原则
         */
        Deque<String> stack = new LinkedList<String>();
        stack.push("1");//入栈
        stack.push("2");
        stack.push("3");
        System.out.println("栈:" + stack);// 栈:[3, 2, 1]
        while (stack.size() > 0) {
            System.out.println(stack.pop());//出栈
        }
        System.out.println(stack);// []
    }
}
### Java 中 Queue Deque 的概念及用法 #### 一、Queue Deque 的定义 在 Java 集合框架中,`Queue` 是一种用于存储元素的集合接口,主要用于实现队列这种先进先出(FIFO, First-In-First-Out)的数据结构。而 `Deque` 则是一种更灵活的双端队列接口,允许从两端进行插入移除操作[^1]。 #### 二、主要功能对比 `Queue` 主要支持 FIFO 操作模式,提供了一些基本方法如 `add(E e)` 添加元素到队尾,`remove()` 移除并返回队首元素等。相比之下,`Deque` 不仅可以作为普通的队列使用,还可以充当或者双向队列的角色,提供了更多灵活性的方法比如 `offerFirst(E e)` 将指定元素插入此 deque 所表示的队列的开头,以及 `pollLast()` 获取并移除此 deque 的最后一个元素[^2]。 #### 三、典型实现类比较 对于 `Queue` 接口来说,常见的实现有 `LinkedList` `PriorityQueue`;而对于 `Deque` 接口,则通常由 `ArrayDeque` 来实现。尽管两者都可以用来创建队列对象,但在性能表现上存在差异——例如,在频繁执行入队/出队操作时,`ArrayDeque` 往往优于 `LinkedList` 因为其内部采用数组而非链表形式管理数据项[^4]。 #### 四、线程安全性考量 无论是基于 `Queue` 还是 `Deque` 构建的应用程序都需要考虑多线程环境下的同步问题。如果需要在线程间共享这些容器,则应选用具备线程安全特性的版本,像 `ConcurrentLinkedQueue` 对于无界非阻塞并发队列是一个不错的选择,而当涉及到带容量限制且需等待条件满足才能继续处理的情况时可考虑使用 `BlockingDeque` 及其实现类如 `LinkedBlockingDeque`[^3]。 #### 五、适用场景举例说明 - **优先级调度**: 如果应用程序中有任务按照一定顺序被执行的需求(比如高优先生效),那么应该选择实现了 `Queue` 接口但具有特殊行为模型的子类型之一 —— `PriorityQueue`。 - **缓存机制构建**: 当设计 LRU (Least Recently Used) 缓存策略时,由于经常涉及快速定位最近最少使用的条目以便淘汰之故,此时利用能够高效完成头尾增删动作的 `Deque` 实现会更加合适一些。 ```java // 使用 ArrayDeque 创建一个简单的双端队列示例 import java.util.ArrayDeque; public class Main { public static void main(String[] args){ ArrayDeque<Integer> deque = new ArrayDeque<>(); // 向头部添加元素 deque.offerFirst(1); deque.push(0); System.out.println(deque.poll()); // 输出最前面的元素并删除它 while(!deque.isEmpty()){ System.out.print(deque.pop()+" "); // 自动弹出顶部元素直到为空 } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰河家园

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值