牛客网刷题之用两个栈实现队列
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结果:
相关文章推荐
- 牛客网刷题--剑指offer(两个栈实现队列)
- 用两个栈来实现一个队列(牛客网(五))
- 牛客网—剑指offer-用两个栈实现队列
- 牛客网-《剑指offer》-用两个栈实现队列
- 牛客网—剑指offer-用两个栈实现队列
- 牛客网 - 剑指Offer - 考点:栈和队列 题目:用两个栈实现队列
- 《剑指offer》牛客网java题解-用两个栈实现队列
- 牛客网-剑指offer-05-用两个栈实现队列
- 两个栈实现一个队列
- 程序员面试题精选100题(18)-用两个栈实现队列
- 用两个堆栈实现一个队列
- 用两个栈实现一个队列的功能 && 两个队列实现一个栈的功能 && 代码实例
- 2.用两个顺序存储结构的栈实现一个队列
- 算法导论10.1-7习题解答(用两个队列实现一个栈)
- 用两个栈实现一个队列
- 用两个栈实现队列
- 算法导论10.1-6习题解答(用两个栈实现一个队列)
- 微软,Google面试题 (18) —— 用两个栈实现一个队列
- 用两个栈实现一个队列的功能...
- 【题目5】如何使用两个栈来实现一个队列