用两个栈实现队列
来源:互联网 发布:小非农数据公布网站 编辑:程序博客网 时间:2024/06/11 19:24
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路:
我们要保证出栈的栈顶元素是先被push的元素,而一般出栈的栈顶元素是后被push的元素。所以,我们需要调整栈中元素的次序。不妨设我们总是用第二个栈s2出栈的元素作为出队元素,那么栈s2中元素的次序必定是调整过的。这个调整过程可以使用栈s1来完成。
解法1:初始状态下,栈s2都为空。将入队元素push进s1,若需要出栈,将s1中元素依次push入s2,再将s2中的栈中元素出栈。出栈完毕后,再将s2中元素依次push入s1,这样又回到了初始状态。循环这个过程就得到了一个队列。
对应的代码如下:
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); return; } public int pop() { while(!stack1.empty()){ stack2.push(stack1.pop()); } int result = stack2.pop(); while(!stack2.empty()){ stack1.push(stack2.pop()); } return result; }}解法2:解法一存在缺点:s2中元素被push入s1后,当下次出栈时,这部分元素仍要被push入s2,显然这是冗余的操作,降低了算法的性能。所以考虑进入s2中的元素不再移动。所以当s2中元素全部出栈前(即s2不空时),不能再向s2中push元素。
由此思路得到解法2,。对应的代码如下:
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); return; } public int pop() { if(!stack2.empty()){ return stack2.pop(); }else{ while(!stack1.empty()){ stack2.push(stack1.pop()); } return stack2.pop(); } }}体会一下这句话:复杂系统总是来源于简单系统的演化。
阅读全文
0 0
- 用两个栈实现队列 & 用两个队列实现栈
- 用两个队列实现栈&用两个栈实现队列
- 用两个栈实现队列 & 两个队列实现一个栈
- 两个栈实现队列&&用两个队列实现一个栈
- 用两个栈实现队列 & 两个队列实现栈
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个队列实现栈
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个队列实现栈
- 用两个栈实现队列
- 用两个队列实现栈
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个栈实现队列
- 自定义注解
- arm-linx-参数
- linux 6 网卡名称修改
- 播放器的基本原理(播放四步法)
- 《Python
- 用两个栈实现队列
- 安卓Android开发笔记——textview 中划线,下划线
- 【R的机器学习】模型性能提升探索:R的其他神经网络包-neuralnet
- 使数据库中的<html>标签可以显示在前端
- 关于spring下自定义异常处理的功能
- Cookie/Session机制
- java-构造方法
- 心得 : 面向对象和面向过程的区别
- setInterval() 第一个参数的用法