【问题标题】:Java LinkedList methods for Queue and Stack队列和堆栈的 Java LinkedList 方法
【发布时间】:2011-12-01 04:32:20
【问题描述】:

如果您查看 Java 的 LinkedList 方法,它确实提供了队列、堆栈、双端队列的操作。

我知道您可以使用 LinkedList 实现队列、堆栈或双端队列。如果您查看 C# 实现,队列和堆栈使用数组。

我的好奇心是,为什么他们为链表提供 push(T e) 方法?

为什么 Queue 和 Stack 不是独立的类,就像 C# 一样。

下面是 push 和 pop 的代码。但为什么呢?

public void push(Object obj)
{
    addFirst(obj);
}

public Object pop()
{
    return removeFirst();
}

如果你看HashMap,或者HashSet,它内部使用数组,并且有LinkedHashSet和对应的map来保持排序。

这并没有真正令人困惑,但它确实没有意义。

为什么java有这样的实现?

【问题讨论】:

    标签: java data-structures stack queue linked-list


    【解决方案1】:

    专注于数据结构实现:

    链表对于频繁的添加和删除是有效的。 (就像 Queue 和 Stack 通常做的那样,迭代操作很少见)。数组不是,它需要数组复制操作,这耗时

    【讨论】:

    • 有一个相关的例子here
    • 和链表需要比数组更多的空间。所以有一个权衡。并且 c# 在内部非常有效地使用数组来实现队列和堆栈实现。
    • @user177883:投票!同意。链表需要更多的“条目”空间。
    【解决方案2】:

    像 Java 的 LinkedList 这样的双链表是一种相当灵活的数据结构,因此使用它作为基础来实现多个数据结构是有意义的。所以如果你想把它看作一个队列,你会这样说(我省略了类型参数):

    Queue q = new LinkedList();
    

    如果你想将它用作堆栈,你可以这样声明它:

    Deque s = new LinkedList();
    

    等等。这一切都归结为代码重用,毕竟,当单个类(在本例中为 LinkedList)就足够时,为什么要为类似的功能实现几个不同的类?

    【讨论】:

      【解决方案3】:

      基本 OOD:虽然可能是一条模糊线,但 Queue、Stack 和 Deque 粗略地描述了您可以对集合执行的操作,因此应该成为接口。 LinkedList 描述了接口的实现和性能特征,因此应该是一个类。该实现可以(被)公开为多个接口。对我来说,真正的问题是,“为什么 Stack 是一个类?”

      【讨论】:

      • 就像Vector,它是legacy
      【解决方案4】:

      LinkedList 实现了Queue 接口,因为您可能希望在某些地方将链表用作队列。这意味着将队列作为输入参数的方法也可以处理链表。以下作品

      List<String> linkedList = new LinkedList<String>();
      linkedList.add("element1");
      linkedList.add("element2");
      
      Queue<String> q = (Queue<String>)linkedList; 
      q.poll(); //removes and returns element1 from the linkedList
      

      Java 有一个名为java.util.Stack 的单独类,它从vector 扩展而来,而vector 又是基于数组的实现。但这是一个线程安全的版本。如果你不担心线程安全,那么你可以使用ArrayDeque作为堆栈。

      【讨论】:

      • 但是,为什么没有像 C# 那样的具体实现呢?如果我想在内部使用数组而不是链表怎么办。你正在做一个计算量很大的演员。
      • 队列接口有很多具体的实现,由数组数据存储支持,例如 PriorityQueue、ArrayDeque 等。当你想要两全其美(列表和队列)时,可以使用链表作为队列
      【解决方案5】:

      Queue 是一个接口,除了 LinkedList 之外还有其他的实现。还有一个 Stack 类。

      最终,这似乎只是一个武断的决定,而底层实现并不那么重要(IMO)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-08
        • 2014-08-03
        • 2015-09-19
        • 1970-01-01
        • 2014-07-21
        • 2013-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多