剑指offer之两个栈模拟队列操作
2015-09-04 09:44
281 查看
队列的特点是先进先出,而栈的特点是先进后出
所以当用两个栈模拟队列的时候,为了依然保持队列的特点,可以将一个栈作为主栈,一个栈作为备用栈
当执行“入队”的时候,可以直接进入主栈;
当执行“出对”的时候,可以先将主栈元素依次push进备用栈直到主栈剩余一个元素(即是要出队的元素)
但是还是有问题的?问题在于执行“出队”时,都要先腾挪到备用栈,执行完再腾挪回主栈。那么是不是多此一举呢?显然,我们可以发现当腾挪到备用栈之后,备用栈的元素顺序就是出队顺序。
所以需要改进代码:
所以当用两个栈模拟队列的时候,为了依然保持队列的特点,可以将一个栈作为主栈,一个栈作为备用栈
当执行“入队”的时候,可以直接进入主栈;
当执行“出对”的时候,可以先将主栈元素依次push进备用栈直到主栈剩余一个元素(即是要出队的元素)
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.isEmpty()){ return 0; } while(stack1.size() > 1 ){ stack2.push(stack1.pop()); } int tmp = stack1.pop(); while(!stack2.isEmpty()){ stack1.push(stack2.pop()); } return tmp; } }
但是还是有问题的?问题在于执行“出队”时,都要先腾挪到备用栈,执行完再腾挪回主栈。那么是不是多此一举呢?显然,我们可以发现当腾挪到备用栈之后,备用栈的元素顺序就是出队顺序。
所以需要改进代码:
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(stack2.isEmpty()){ if(stack1.isEmpty()){ return 0; } while(!stack1.isEmpty()){ stack2.push(stack1.pop()); } } return stack2.pop(); } }
相关文章推荐
- JQuery选择器大全
- [LeetCode] Populating Next Right Pointers in Each Node I, II
- css命名规范
- jquery实现浮动在网页右下角的彩票开奖公告窗口代码
- JavaScript中的逻辑运算的返回值(逻辑与&&,逻辑或||,逻辑非!)
- Json 基本应用
- 【JavaScript】实现计算日期相差天数
- tableView 的 cell 的分割线样式
- html中有关如何固定div大小的问题
- 剑指offer之树的子结构
- 在rust里使用unstable feature
- JSP获取绝对物理地址
- laydate JS日期插件
- 前端路上的各种问题-javascript—6
- 如何在JavaScript捕获鼠标事件
- html5中的一些小知识点(CSS)
- js base64 加密
- [LeetCode#241]Different Ways to Add Parentheses
- BZOJ 题目1012: [JSOI2008]最大数maxnumber(线段树)
- NodeJS入门(四)—— path对象