您的位置:首页 > 其它

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

2016-10-04 10:22 162 查看

题目描述:



解题思路:

  栈是先进后出的,而队列是先进先出的,不过题目要求是用两个栈,那么,我们就可以用一个栈来当做缓冲区,出队的时候,先将栈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结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: