【问题标题】:Using a stack as a Queue in Java在 Java 中使用堆栈作为队列
【发布时间】:2012-10-22 12:12:34
【问题描述】:

我需要以不同的顺序处理一棵树,比如说 BFS 和 DFS。通过使用队列或堆栈,两者都很容易,但是,我在 Java 中缺少一个适当的接口,允许执行类似的操作

QueueOrStack<N> pending = ...
while (!pending.isEmpty()) {
    N node = pending.poll(); // <----- this is the problem
    pending.addAll(node.children());
    process(node);
}

没有真正的问题,我可以将 ArrayList 封装到实现 Queue1 的东西中,但是我敢打赌我忽略了 Java 集合框架中的一些东西。还是真的不见了?

__

1 或使用带有PriorityQueue 的最新优先比较器,这可能是一个愚蠢的想法

【问题讨论】:

    标签: java stack queue


    【解决方案1】:

    有这样的结构。

    它被称为ArrayDeque -> http://docs.oracle.com/javase/6/docs/api/java/util/ArrayDeque.html

    【讨论】:

    • +1 - 我从未使用过该课程,但我浏览了文档,它看起来与本案例所需的完全一样。还值得指出的是,文档指出“此类用作堆栈时可能比 Stack 快,用作队列时可能比 LinkedList 快。”这很好!
    • 确实,结构是DequeArrayDeque是一个实现。
    • @Alexander Pogrebnyak:我看到它有所有需要的操作,但我仍然需要做一些类似N node = asStack ? pending.pollLast() : pending.pollFirst() 的事情。但这还不错。
    • @maaartinus:使用 ArrayDeque 作为字段和布尔 asStack 创建自己的类。然后公开你想要的方法(即public E poll() { asStack ? pending.pollLast() : pending.pollFirst() })。如果你愿意,你可以让它实现 Stack 和 Queue 接口。
    • @maaartinus LinkedList 也实现了 Deque,至少 in this case 它的性能比基于数组的要好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2010-11-20
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    相关资源
    最近更新 更多