java实现“用两个栈实现队列”

本文介绍了一种使用两个栈来实现队列的方法。通过定义一个入列栈和一个出列栈,实现了队列的基本操作:在队列尾部插入元素和从队列头部删除元素。当出列栈为空时,会将入列栈的所有元素复制到出列栈,确保出列操作始终可用。

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

两个栈,一个栈作为入列栈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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值