如果是只有一个元素的话,对于栈和队列而言,那么就可以认为入队、出队过程约等于进栈、出栈过程(仅仅是个人觉得,都只对一个元素在操作)
在这种情况下,可以直接把这个元素放进主队列中

如果不是第一个元素,后面的元素就需要用到辅助队列了,我的想法是把后来的元素先放进辅助队列,然后依次把主队列中已有的元素出队,并且入队到辅助队列中,图解一下:
如果这个时候1已经在主队列中了,2要入队就要先进入辅助队列

把主队列中所有的元素出队,并且放入辅助队列中:

这时候交换两个队列,先看一下交换后的效果:

这里交换的时候需要注意一个点,不要使用如下代码来交换(惨痛的教训):
mainQueue = supportQueue;
supportQueue.clear();
后来debug的时候发现,第一行代码确实可以做到把主队列赋值为与辅助队列相同的结果

但是第二步执行完成之后发现,居然都被clear了

原因是他们是引用数据类型,并且mainQueue = supportQueue;使他们的hashcode是相同的,都指向了同一个内存地址,也就是说如果执行clear都会被执行
正确的方法(这里只说说我改正后的方法)
mainQueue.addAll(supportQueue);
supportQueue.clear();
将辅助队列的元素全部加入到主队列,再清空就可以了
public class QStack {
    Queue<Integer> mainQueue;
    Queue<Integer> supportQueue;
    public QStack() {
        mainQueue = new LinkedList<>();
        supportQueue = new LinkedList<>();
    }
    public void push(int x) {
        if (mainQueue.isEmpty())
            mainQueue.offer(x);
        else{
            supportQueue.offer(x);
            while(!mainQueue.isEmpty())
                supportQueue.offer(mainQueue.poll());
            mainQueue.addAll(supportQueue);
            supportQueue.clear();
        }
    }
    public int pop() {
        return mainQueue.isEmpty() ? -1 : mainQueue.poll();
    }
    public int top() {
        return mainQueue.isEmpty() ? -1 : mainQueue.peek();
    }
    public boolean empty() {
        return mainQueue.isEmpty();
    }
public static void main(String[] args) {
    QStack qStack = new QStack();
    System.out.println("为空?" + qStack.empty());
    qStack.push(1);
    qStack.push(2);
    qStack.push(3);
    System.out.println("栈顶:" + qStack.top());
    System.out.println("弹出:" + qStack.pop());
    System.out.println("为空?" + qStack.empty());
    System.out.println("弹出:" + qStack.pop());
    System.out.println("弹出:" + qStack.pop());
    System.out.println("为空?" + qStack.empty());
}

完全符合了栈(后进先出)的特点
原文:https://www.cnblogs.com/we1yu4n/p/14743033.html