【问题标题】:Java: How to create a stack using the queue interface?Java:如何使用队列接口创建堆栈?
【发布时间】:2015-01-26 12:49:39
【问题描述】:

我有一个接受队列的函数,我想像堆栈一样对它们执行操作。不幸的是,像 addFirst 这样的 ArrayDeque 方法在 Queue 接口中是不可见的,所以我不能使用它们。有没有办法在队列上执行堆栈操作?

谢谢!

【问题讨论】:

  • 这个问题是Queue接口没有指定数据是插入到头部还是尾部。因此,您无法知道自己在队列上到底在做什么。
  • 这个问题是队列不是堆栈。先进先出与后进先出。你有什么令人信服的理由不为你的队列使用队列?

标签: java stack queue


【解决方案1】:

有!在 Collections 类中查看asLifoQueue(Deque<T> deque)https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#asLifoQueue(java.util.Deque)

将 Deque 的视图返回为后进先出 (Lifo) 队列。方法 add 映射到 push,remove 映射到 pop 等等。这种观点 当您想使用需要 Queue 的方法时会很有用 但您需要 Lifo 订购。

它返回一个实现 Queue 接口的新类,除了将 Queue 方法重新绑定到您的 Deque 中的相应方法,以便它用作 LIFO 堆栈!

Java 库充满了神奇的东西,如果你去寻找它们!

【讨论】:

  • 嘿,多方便啊!谢谢。
  • 但这需要Deque
【解决方案2】:

注意:如果您不能使用像下面这样的 OO 方法,只需使用像 q 这样的队列,然后按如下所示操作队列。

如果您必须使用队列,这是一个不错的解决方案,尽管对我们来说更好的方法是使用 Stack 类,或者使用其他数据结构实现 Stack。

public class MyStack<T> {

/**
 * @param args
 */
private Queue<T> q = new LinkedList<T>();
public MyStack(){
}
public static void main(String[] args) {
    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

【讨论】:

  • 问题在于MyStack 既不是堆栈也不是队列。
猜你喜欢
  • 2018-08-05
  • 1970-01-01
  • 2017-10-07
  • 2012-10-22
  • 2019-03-07
  • 2015-06-16
  • 2010-11-20
  • 2015-09-19
  • 1970-01-01
相关资源
最近更新 更多