算法2--由两个栈组成的队列

这篇博客介绍了如何使用两个栈来模拟队列的操作,包括add、poll和peek。作者提供了详细的思路和代码实现,强调了在将元素从stackPush移到stackPop时的条件,以及在不同操作之间的数据转移策略。代码中通过pushToPop方法确保了队列的正确顺序,并在poll和peek操作中进行了相应的检查和转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由两个栈组成的队列

题目】编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)。
思路
维护两个栈,里面分别存压入栈的数据–需要考虑情况
1.如果 stackPush 要往 stackPop 中压入数据,那么必须一次性把 stackPush 中的数据全部压入。
2.如果 stackPop 不为空,stackPush 绝对不能向 stackPop 中压入数据。
代码

/**
 * @auther Jack
 * @create 2020-10-29-19:46
 *
 * 【题目】
 * 编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)。
 *
 * 1.如果 stackPush 要往 stackPop 中压入数据,那么必须一次性把 stackPush 中的数据全部压入。
 * 2.如果 stackPop 不为空,stackPush 绝对不能向 stackPop 中压入数据。
 * 【思路】
 * 维护两个栈,里面分别存压入栈的数据--需要考虑情况
 * 1.push里面的数据,要换到pop里面,这样直接从pop里面弹出,才是正确的序列
 * 2.354121,这几个数字如果压栈,
 */
public class Test_2 {

    public static void main(String[] args) {
        TwoStacksQueue stack1 = new TwoStacksQueue();
        //第一次add之后,也就是说,把最外面的数据,放到了pop里面,然后不在push里面维护第一个进去的数字
        stack1.add(3);
        //这是连续的add,此时不用往pop里面放
        stack1.add(4);
        stack1.add(5);
        stack1.add(1);
        //这个时候要进行poll,直接拿掉pop里面唯一的值
        System.out.println(stack1.poll());
        //这个时候pop为空,那么再调用的时候,会再pushToPop这个方法,然后把栈底的一个数,放到pop里面
        System.out.println(stack1.poll());
        //因为pop为空,那么这个时候add的时候,会把所有的push都给到pop里面
        stack1.add(2);
        stack1.add(1);
//        这个时候再进行poll的时候,直接从pop里面拿数据
        System.out.println(stack1.poll());
    }
}

class TwoStacksQueue{

    public Stack<Integer> stackPush;
    public Stack<Integer> stackPop;

    TwoStacksQueue(){
        stackPush = new Stack<Integer>();
        stackPop = new Stack<Integer>();
    }
    public void add(int newNum){
        this.stackPush.push(newNum);
        //思考。压第一次栈的时候,就把数据到pop里面了,这个时候push里面只有一个数据--怎么想出来的,思维?
        //因为再poll之后,会把这个pop清空。然后再add或者push的时候,会把poll之前的所有数据都,放进pop里面,
        //比如354121----3,放进pop,我们poll之后--会有两个操作
                                    //1.继续poll,那么我们需要在poll之前,把push里面的数据都push到pop里面
                                    //2.继续add,那么我们就在add的时候,把push里面的数据都给pop,然后push里面的数据清空,
                                    //这个时候,pop里面会有再上一次poll到现在的所有数据,然后push被清空。直至等待pop里面的数据为空的时候
                                    //再进行一次pushToPop操作
        pushToPop();
    }

    public void pushToPop(){
        if(stackPop.isEmpty()){
            while (!stackPush.isEmpty()){
                //这里把push里面的数据,直接放到pop里面,不做维护了,因为
                stackPop.push(stackPush.pop());
            }
        }
    }

    public Integer poll(){
        if(stackPush.isEmpty() && stackPop.isEmpty() ){
            throw new RuntimeException("");
        }
        pushToPop();
        return stackPop.pop();
    }

    public Integer peek(){
        if(stackPush.isEmpty() && stackPop.isEmpty() ){
            throw new RuntimeException("");
        }
        pushToPop();
        return stackPop.peek();
    }
}

class TwoStacksQueue1 {
    public Stack<Integer> stackPush;
    public Stack<Integer> stackPop;

    public TwoStacksQueue1() {
        stackPush = new Stack<Integer>();
        stackPop = new Stack<Integer>();
    }

    // push 栈向 pop 栈倒入数据
    private void pushToPop() {
        if (stackPop.empty()) {
            while (!stackPush.empty()) {
                stackPop.push(stackPush.pop());
            }
        }
    }

    public void add(int pushInt) {
        stackPush.push(pushInt);
        pushToPop();
    }

    public int poll() {
        if (stackPop.empty() && stackPush.empty()) {
            throw new RuntimeException("Queue is empty!");
        }
        pushToPop();
        return stackPop.pop();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值