牛客网刷题之用两个栈实现队列

来源:互联网 发布:德里克罗斯体测数据 编辑:程序博客网 时间:2024/05/18 12:32

题目描述:

这里写图片描述

解题思路:

  栈是先进后出的,而队列是先进先出的,不过题目要求是用两个栈,那么,我们就可以用一个栈来当做缓冲区,出队的时候,先将栈1中的元素倒入栈2中,然后将栈2中的元素再出栈就实现了队列中元素的先进先出特性。
  显然,在此基础上,我们还可以对程序进行优化,将栈1中元素倒入栈2时,可以留下最后一个元素直接出栈,就少了一次倒入栈2再从栈2中出栈的操作。既然我们可以通过这种方式来减少倒入及倒出的操作来进行优化,那么入队的时候就可以直接将元素放进栈1中,出队的时候,先判断栈2是否为空,如果不为空,说明栈2前一步操作还有元素没出栈,依照队列先进先出的特点,在放进新元素,以及要将先元素出队之前,栈2中剩余的元素是要先出去的,所以,先将栈2中的元素出栈;如果栈2为空,就将栈1中的元素倒入栈2中,然后栈2进行出栈操作。当然,无论栈1还是栈2,我们都需要进行是否为空的判断,以免运行出现异常。
  以后碰到这种两个栈实现队列或者两个队列实现栈的问题,就可以借助这种思考方式:将元素push进栈(队)1中,pop操作的时候,先先判断栈1和栈2是否为空,如果都为空就抛出异常。然后判断栈(队)2是否为空,如果不为空,就先在栈(队)2中进行pop操作,如果为空,就先将栈(队)1中的元素倒入栈(队)2中,再进行pop操作。

题解:

import java.util.Stack;public class Solution {    Stack<Integer> stack1 = new Stack<Integer>();    Stack<Integer> stack2 = new Stack<Integer>();     public void push(int node) {        stack1.push(node);    }    public int pop() {        if(stack1.empty() && stack2.empty()){            throw new RuntimeException("Query is rmpty");        }        if(stack2.empty()){            while(! stack1.empty()){                stack2.push(stack1.pop());            }        }        return stack2.pop();    }}

ac结果:

这里写图片描述

0 0