由两个栈组成的队列

题目描述

编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)

问题解答

要实现队列的先进先出功能,对于一个元素,它先进一个第一个栈,出时会后出,此时,再将其压入第二个栈,便会成为后进先出了,此时顺序就成为了先进先出了。

大体上思路是这样,但是分别考虑这三个方法(add,poll,peek),会发现很多细节之处需要考虑。add方法其实没有什么细节考虑
对于poll方法,当第一次poll后,会把第一个栈所有的元素都压入到第二个栈中,此时从第二个栈中poll,但是之后当再往第一个栈中压入元素后,当再次要求poll后,此时就会面临以下两种情况
1 第二个栈为空,此时,直接将第一个栈的元素压入第二个栈并poll就行
2 第二个栈为非空,则主要将第二个栈的元素直接pop就好
对于peek方法,考虑情况时和poll类似,这里就不详细解释了

代码如下

import java.util.Stack;

public class StackAndQueue {
    public Stack stackPush;

    public Stack stackPop;

    public StackAndQueue(){
        stackPush = new Stack();
        stackPop = new Stack();
    }

    public void add(int num){
        stackPop.push(num);
    }

    public int poll(){
        if(stackPop.isEmpty()){
            if(stackPush.isEmpty()){
                throw new RuntimeException("Queue is empty");
            }else{
                while(!stackPush.isEmpty()){
                   stackPop.push(stackPush.pop());
                }
            }
        }
        return stackPop.pop();
    }

    public int peek(){
        if(stackPop.isEmpty()){
            if(stackPush.isEmpty()){
                throw new RuntimeException("Queue is empty");
            }else{
                while(!stackPush.isEmpty()){
                    stackPop.push(stackPush.pop());
                }
            }
        }
        return stackPop.peek();
    }
}

你可能感兴趣的:(由两个栈组成的队列)