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

时间:2011-07-26 16:10:10

标签: java collections queue fifo

在Java doc中:

  

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

java.util.queue的实施如何使用 LIFO 而不是 FIFO

7 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:9)

您可以使用java.util.LinkedList并使用pop()push()方法,并像堆栈一样使用它,这是一个LIFO队列。

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

Deque可以用作LIFO或FIFO

答案 4 :(得分:2)

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

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

  

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

答案 5 :(得分:2)

队列 的实现可以基于 FIFO 优先级 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。

答案 6 :(得分:0)

我制作了一个大小有限的LIFO队列。通过将最旧的条目替换为新的条目来保持大小限制。该实现基于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);
}
}