【问题标题】:How implementation of java.util.queue uses LIFO?java.util.queue 的实现如何使用 LIFO?
【发布时间】:2011-10-13 13:43:42
【问题描述】:

在 Java 文档中:

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

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

【问题讨论】:

  • 您的问题是什么?队列作为数据结构通常是 FIFO,而堆栈作为数据结构通常是 LIFO。
  • 你想使用 LIFO 数据结构实现 FIFO 队列吗?
  • +1 提问。在我的书中,我遇到了以下令人困惑的引述:队列是容器的基本接口,它包含一系列要处理的元素。例如,实现 Queue 的类可以是 LIFO(后进先出——如堆栈数据结构)或 FIFO(先进先出——如队列数据结构)。

标签: java collections queue fifo


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以使用java.util.LinkedList 并使用pop()push() 方法并将其用作堆栈,即LIFO 队列。

    【讨论】:

      【解决方案3】:

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

      当程序员第一次看到“队列”时,他会自动认为“一定是先进先出顺序”( 或最终的优先顺序)。但正如文档所说,必须有可能使用 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。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          双端队列可以用作 LIFO 或 FIFO

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

            • 你能仔细检查一下链接吗?我认为其他人可能已经购买了该域名。
            【解决方案7】:

            我创建了一个大小有限的 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);
            }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-05-28
              • 1970-01-01
              • 1970-01-01
              • 2013-06-19
              • 2014-02-21
              • 1970-01-01
              • 2011-06-04
              相关资源
              最近更新 更多