java.util.queue的实现如何使用LIFO?

发布于 2024-11-26 13:51:19 字数 229 浏览 1 评论 0原文

在 Java 文档中:

[...] 例外的是优先级队列,它根据提供的比较器或元素的自然顺序对元素进行排序,以及 LIFO 队列(或堆栈),它对元素进行 LIFO(后进先出)排序。出)

java.util.queue 的实现使用 LIFO 而不是 FIFO

In Java doc:

[...] Among the exceptions are priority queues, which order elements according to a supplied comparator, or the elements' natural ordering, and LIFO queues (or stacks) which order the elements LIFO (last-in-first-out)

How implementation of java.util.queue uses LIFO instead of FIFO?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

蓝海 2024-12-03 13:51:19

您可以使用 Collections.asLifoQueue 方法将任何 Deque 用作 LIFO 队列:

Queue<Integer> arrayLifoQueue = Collections.asLifoQueue(new ArrayDeque<Integer>());
Queue<Integer> linkedListLifoQueue = Collections.asLifoQueue(new LinkedList<Integer>());

You can use any Deque as a LIFO queue using Collections.asLifoQueue method:

Queue<Integer> arrayLifoQueue = Collections.asLifoQueue(new ArrayDeque<Integer>());
Queue<Integer> linkedListLifoQueue = Collections.asLifoQueue(new LinkedList<Integer>());
牛↙奶布丁 2024-12-03 13:51:19

您可以使用 java.util.LinkedList 并使用 pop()push() 方法,并将其像堆栈一样使用,即后进先出队列。

You can use a java.util.LinkedList and use the pop() and push() methods and use it like a stack, which is a LIFO queue.

手长情犹 2024-12-03 13:51:19

队列的实现可以基于先进先出优先级LIFO - 这就是官方文档所说的。

当程序员第一次看到“队列”时,他会自动想到“它一定是 FIFO 顺序”(或最终优先顺序)。但正如文档所说,必须有可能使用 Queue 接口进行 LIFO 排序。让我向您解释一下如何做到这一点。

// FIFO queue usage
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);

queue.remove(); // returns 1
queue.remove(); // returns 2

// LIFO queue usage
Queue<Integer> queue = Collections.asLifoQueue(new ArrayDeque<>());
queue.add(1);
queue.add(2);

queue.remove(); // returns 2
queue.remove(); // returns 1

正如您所看到的,根据实现的不同,Queue 接口也可以用作 LIFO。

Implementation of the Queue can base on FIFO, priorities and LIFO - that is what official documentation says.

When a programmer first sees "Queue" he automatically thinks "it must be FIFO order" (or eventually prioritized order). But as documentation says there must be possibility to use Queue interface for LIFO ordering. Let me explain you how it can be done.

// FIFO queue usage
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);

queue.remove(); // returns 1
queue.remove(); // returns 2

// LIFO queue usage
Queue<Integer> queue = Collections.asLifoQueue(new ArrayDeque<>());
queue.add(1);
queue.add(2);

queue.remove(); // returns 2
queue.remove(); // returns 1

As you can see depending on the implementation, Queue interface can be used also as a LIFO.

七堇年 2024-12-03 13:51:19

这里提供的Stack和LinkedList只是一个集合。队列不是集合。它是并发包的一部分,可以与线程池一起使用。

我刚刚再次验证并阅读了您引用的javadoc。我认为使用 LIFO 队列的唯一选择是使用带有自定义比较器的优先级队列,该比较器根据插入时间以相反的顺序比较元素。

Stack and LinkedList offered here are just a collections. Queue is not a collection. It is a part of concurrency package and can be used with threadpools.

I have just verified again and read javadoc that you have quoted. I think that the only option to use LIFO queue is to use priority queue with custom comparator that compare elements according to the insertion time in reverse order.

酒浓于脸红 2024-12-03 13:51:19

Deque 可用作 LIFO 或 FIFO

Deque can be used as LIFO or FIFO

帅哥哥的热头脑 2024-12-03 13:51:19

队列是一种使用先进先出技术的数据结构。

这是一个有用的链接:magi.toolkit。 util.queue 类 LIFOQueue

“后进先出”队列的实现。基本上,后进先出法
队列是一个堆栈。

Queue is a data structure that uses a technique of First-In-First-Out.

Here's a useful link : magi.toolkit.util.queue Class LIFOQueue

An implementation of a "Last In, First Out" Queue. Basically, a LIFO
Queue is a Stack.

貪欢 2024-12-03 13:51:19

我做了一个大小有限的后进先出队列。通过用新条目替换最旧的条目来维持有限的大小。实现基于LinkedList。

package XXXX;

import java.util.LinkedList;

public class LIFOQueueLimitedSize<E> extends LinkedList<E> {


/**
 * generated serial number
 */
private static final long serialVersionUID = -7772085623838075506L;

// Size of the queue
private int size;

// Constructor
public LIFOQueueLimitedSize(int crunchifySize) {

    // Creates an ArrayBlockingQueue with the given (fixed) capacity and default access policy
    this.size = crunchifySize;
}

// If queue is full, it will remove oldest/first element from queue like FIFO
@Override
synchronized public boolean add(E e) {

    // Check if queue full already?
    if (super.size() == this.size) {
        // remove element from queue if queue is full
        this.remove();
    }
    return super.add(e);
}
}

I made a LIFO queue with limited size. Limited size is maintained by replacing the oldest entries with the new ones. The implementation is based on LinkedList.

package XXXX;

import java.util.LinkedList;

public class LIFOQueueLimitedSize<E> extends LinkedList<E> {


/**
 * generated serial number
 */
private static final long serialVersionUID = -7772085623838075506L;

// Size of the queue
private int size;

// Constructor
public LIFOQueueLimitedSize(int crunchifySize) {

    // Creates an ArrayBlockingQueue with the given (fixed) capacity and default access policy
    this.size = crunchifySize;
}

// If queue is full, it will remove oldest/first element from queue like FIFO
@Override
synchronized public boolean add(E e) {

    // Check if queue full already?
    if (super.size() == this.size) {
        // remove element from queue if queue is full
        this.remove();
    }
    return super.add(e);
}
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文