使用两个栈实现队列,并提供一个队列尾部插入节点和队列头部删除节点方法。

两个栈,一个栈作为入列栈inputStack,一个栈作为出列栈outputStack。

对于入列操作,直接将元素push到inputStack中。

对于出列操作,

outputStack存在元素时,outputStack直接pop;

outputStack为空时,检查inputStack是否为空,inputStack不为空则将inputStack元素复制到outputStack,复制完成,outputStack首元素出列。inputStack为空,则抛出错误。

public class QueueByTwoStacks {
    /**
     * inputStack为入列栈,outputStack为出列栈
     */
    private static Stack<Integer> inputStack = new Stack<>();
    private static Stack<Integer> outputStack = new Stack<>();


    /**
     * 队列尾部插入节点
     * @param item 插入值
     * @return 返回插入的值
     */
    public static Integer appendTail(int item){
        return inputStack.push(item);
    }

    /**
     * 队列头部删除节点
     * @return 返回删除的节点值
     */
    public static Integer deleteHead(){
        //队列没有元素,抛出异常
        if (size() == 0){
            throw new IndexOutOfBoundsException("Queue is empty");
        }
        //出列栈为空,入列栈不为空,将入列栈所有元素复制到出列栈,并将入列栈元素清空,返回出列栈首元素
        if (outputStack.empty()){
            copy(outputStack,inputStack);
        }
        //出列栈不为空,返回首元素
        return outputStack.pop();
    }

    private static int size(){
        return inputStack.size()+outputStack.size();
    }

    /**
     * 将入列栈的元素复制到出列栈,并将入列栈元素清空
     * @param dest 出列栈
     * @param src 入列栈
     */
    private static void copy(Stack<Integer> dest,Stack<Integer> src){
        while (!src.empty()){
            dest.push(src.pop());
        }
    }

    public static void main(String[] args) {
        for (int i = 0;i<5;i++){
            appendTail(i);
        }
        System.out.println(deleteHead());
        System.out.println(deleteHead());
        System.out.println(deleteHead());
        appendTail(11);
        appendTail(12);
        System.out.println("-------遍历输出-----");
        while (size() > 0){
            System.out.println(deleteHead());
        }
    }
}
0
1
2
-------遍历输出-----
3
4
11
12