【问题标题】:Java: Implement stack with one queue, any problems?Java:用一个队列实现堆栈,有什么问题吗?
【发布时间】:2013-08-05 12:56:48
【问题描述】:

所以我尝试用一​​个队列实现一个堆栈,它似乎可以工作,但我不确定它是否有问题,因为我在网上看到的大多数解决方案都使用两个队列。谁能告诉我我的实施是否有问题?

public class MyStack<T> {

/**
 * @param args
 */
private Queue<T> q = new LinkedList<T>();
public MyStack(){
}
public static void main(String[] args) {
    // TODO Auto-generated method stub
    MyStack<String> s = new MyStack<String>();
    s.push("1");
    s.push("2");
    s.push("3");
    s.push("4");
    System.out.println(s.pop());
    System.out.println(s.pop());
    System.out.println(s.pop());
    System.out.println(s.pop());
    System.out.println(s.pop());
}

public void push(T s){
    q.offer(s);         
}

public T pop(){
    int n = q.size();
    for(int i = 0; i < n-1; i++){
        q.offer(q.poll());              
    }
    return q.poll();
}
}

输出:
4
3
2
1

【问题讨论】:

  • 如果您想对这不是网站进行代码审查,您是否有意外行为?
  • 没有意外行为。我只是想知道为什么大多数在线解决方案使用两个队列,而一个似乎工作正常。
  • 从未见过使用 2 个队列实现的堆栈,您见过的解决方案是什么?另外,为什么Queue,因为那是先进先出,堆栈是后进先出。
  • 我找到的两个队列实现在这里:stackoverflow.com/questions/688276/…
  • 我在一次采访中被要求这样做。我没有想出这种情况......

标签: java stack queue


【解决方案1】:

堆栈绝对没有理由使用两个队列。事实上,它只需要跟踪一个引用它下面的节点的顶级节点。

代码似乎可以工作,但正如 nachokk 所说,这不是代码审查的站点。如果您遇到错误并需要帮助,本网站将提供帮助。

【讨论】:

    【解决方案2】:

    您应该使用StackDeque 甚至LinkedList

    实现你自己的只是......毫无意义。当然,除非(正如@bas 建议的那样)您正在学习数据结构课程,在这种情况下,您应该去 Commando 并从头开始实现自己的结构。使用另一种结构,因为它与您尝试制作的结构几乎相同,就像使用带螺丝的锤子一样。

    如果你真的需要自己实现一些东西,这样的东西应该可以工作:

    public class Stack<T> {
      private Entry top = null;
    
      private class Entry {
        final Entry up;
        final T it;
    
        public Entry(Entry up, T it) {
          this.up = up;
          this.it = it;
        }
      }
    
      public void push ( T it ) {
        top = new Entry(top, it);
      }
    
      public T pop () {
        if ( top == null ) {
          throw new EmptyStackException();
        }
        T it = top.it;
        top = top.up;
        return it;
      }
    }
    

    注意:这可能不是线程安全的。

    【讨论】:

    • 如果您正在学习 Java 数据结构课程,则不会。我从不认为了解这些结构是如何工作的以及如何有效地实施它们是一件坏事。
    • 谢谢,我不知道 Deque 存在。但无论如何,我只是想这样做,因为我在一次采访中被问到。如果我自己做,我只会使用 Java 自己的实现,而不是试图重新发明轮子。
    • @user2017502 - 我添加了一种简单的可能性。
    【解决方案3】:

    您的解决方案效率低下,因为每次您从中弹出一些东西时都必须遍历整个堆栈。 (实际上,在删除最后的元素之前,您必须遍历整个链表。) 编辑:Java 的链表是双向链接的,所以这完全没有意义。

    【讨论】:

    • 如果您只有基本队列。您将如何更有效地实施它?
    【解决方案4】:

    只有当您有基本的队列操作(例如入队和出队)时,您才必须使用两个队列。当您可以使用其他方法时,尤其是对队列进行迭代时,您可以像以前那样只使用一个队列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 2014-12-23
      • 2010-10-15
      • 1970-01-01
      • 2021-07-08
      • 2021-12-09
      相关资源
      最近更新 更多