美文网首页
由两个栈组成的队列

由两个栈组成的队列

作者: 一念叩心 | 来源:发表于2018-12-15 17:58 被阅读0次

    题目描述

    编写一个类,用两个栈实现队列,支持队列的基本操作(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<Integer> stackPush;
    
        public Stack<Integer> stackPop;
    
        public StackAndQueue(){
            stackPush = new Stack<Integer>();
            stackPop = new Stack<Integer>();
        }
    
        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();
        }
    }
    

    相关文章

      网友评论

          本文标题:由两个栈组成的队列

          本文链接:https://www.haomeiwen.com/subject/kseahqtx.html