【Java】按升序对栈进行排序
2015-07-13 10:32
411 查看
编写程序,按升序对栈进行排序(即最大元素位于栈顶)。最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构(如数组)。
该栈支持如下操作:push, pop, peek,和isEmpty
如果可以支持两个栈,我们可以每一次遍历栈1,将最小的元素放入栈2,把栈3作为搜索时的缓冲区
但是这里只能使用一个额外栈,那是不是就没有办法了呢?不是的
我们不需要反复搜索栈1来依次获得最小值,假设栈s是要排序的栈,栈r是已排序的栈
s = [5,10,7]
r = [12,8 ,3,1]
栈顶元素5在r中的正确位置应该是3的上面,我们可以先弹出5,反正5是无论如何都要从s压入r的,然后将12和8压入栈s,然后将5压入栈r
注意这是12和8没有在r中了,但是只要我们不改变它们在s中的顺序,重复上面的步骤,12和8一次从s弹出再压入r还是在5的上面,r依然是有序的。
时间复杂度为O(n^2),空间复杂度O(n)
该栈支持如下操作:push, pop, peek,和isEmpty
如果可以支持两个栈,我们可以每一次遍历栈1,将最小的元素放入栈2,把栈3作为搜索时的缓冲区
但是这里只能使用一个额外栈,那是不是就没有办法了呢?不是的
我们不需要反复搜索栈1来依次获得最小值,假设栈s是要排序的栈,栈r是已排序的栈
s = [5,10,7]
r = [12,8 ,3,1]
栈顶元素5在r中的正确位置应该是3的上面,我们可以先弹出5,反正5是无论如何都要从s压入r的,然后将12和8压入栈s,然后将5压入栈r
注意这是12和8没有在r中了,但是只要我们不改变它们在s中的顺序,重复上面的步骤,12和8一次从s弹出再压入r还是在5的上面,r依然是有序的。
时间复杂度为O(n^2),空间复杂度O(n)
import java.util.Stack; public class sort { public static Stack<Integer> sortStk(Stack<Integer> s) { Stack<Integer> r = new Stack<Integer>(); while( !s.isEmpty() ) { int temp = s.pop(); while ( !r.isEmpty() && r.peek() > temp) { s.push(r.pop()); } r.push(temp); } return r; } }
相关文章推荐
- 细小知识点之Java
- 用Java实现一些常见的问题
- 离线使用eclipse的代码提示功能
- Java报表生成技术
- Java-文件上传和下载
- MyEclipse 打开Struts配置文件时出错
- java算法学习
- Java Collections工具类
- ubuntu jdk1.7 安装
- [LeetCode][Java] Sudoku Solver
- 深入研究java.lang.Class类
- JAVA集合学习之——Properties类
- Java中的位运算符与基本数据类型
- eclipse常用快捷键
- java并发库之Executors常用的创建ExecutorService的几个方法说明
- java中的堆、栈、常量池
- 深入研究java.lang.ThreadLocal类
- Myeclipse快捷键大全
- spring mvc 异常统一处理方式
- Java调试