牛客网刷题之用两个栈实现队列
来源:互联网 发布:德里克罗斯体测数据 编辑:程序博客网 时间: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
- 牛客网刷题之用两个栈实现队列
- 用两个栈实现队列 & 用两个队列实现栈
- 用两个队列实现栈&用两个栈实现队列
- 用两个栈实现队列 & 两个队列实现一个栈
- 两个栈实现队列&&用两个队列实现一个栈
- 用两个栈实现队列 & 两个队列实现栈
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个队列实现栈
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个队列实现栈
- 用两个栈实现队列
- 用两个队列实现栈
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个栈实现队列
- Parentheses(弱校联盟十一专场)字典序
- 分块练习 A
- Swift 扩展(Extension)总结
- px 与 dp, sp换算公式?
- 2016-10-03
- 牛客网刷题之用两个栈实现队列
- JSON
- Linux数据类型总结
- vim中的常用命令
- HDU 5901 - Count Primes
- [LeetCode]--102. Binary Tree Level Order Traversal
- 微信接收时间推送
- Prototype_Level1
- 画中画视频输出模块中的alpha混合程序解读