用一个栈实现另一个栈的排序(每日一道算法题)
2017-11-17 16:57
260 查看
要求:不能使用其他数据结构,只能使用一个栈加一个新的变量,实现对一个整数类型的栈排序。
过程:
①首先help为空,那么直接将stack栈顶的元素4 pop出压入help
②stack不为空,继续将5弹出并保存到pop,比较pop和help里面的4,发现4小,将4返回到stack中,继续将5压入。
③stack不为空,继续将4弹出,和5比较,不满足4>5,接着讲4压入。
④接着同上将2压入。
⑤最后将help内元素弹出压入到stack中。
总结:想让stack自上而下从大到小,所以要将help里自上而下从小到大,每次都将stck(不为空的时候)里的元素弹出并压入help,但是对于已经压入的元素要和新压入的元素进行比较,若新压入的元素大,那么就得让已压入的元素返回到stack中进行重新压入help。这样就实现了help里面自上而下从小到大,也就实现了stack里面自上而下从大到小。
参考文献:《程序员代码面试指南》
package stack; import java.util.Stack; /** * @author:MindMrWang *2017年11月17日 *:function:利用一个辅助栈和一个变量将一个栈从顶到底从大到小排序 */ public class sortStackByStack { public static void main(String[] args) { Stack<Integer> stack = new Stack<Integer>(); stack.push(2); stack.push(5); stack.push(4);//原来的自顶到下的顺序是4,5,2 sort(stack);//如果不进行排序,弹出得到的顺序应该是:4,5,2 while(!stack.isEmpty()) { System.out.print(stack.pop()+","); } } public static void sort(Stack<Integer> stack) { Stack<Integer> help = new Stack<Integer>();//新建一个辅助栈 while(!stack.isEmpty()) {//判断当前需要排序的栈不为空 int pop = stack.pop();//将排序的栈顶元素弹出 while(!help.isEmpty()&&help.peek()<pop) {//里面的判断顺序不能颠倒,否则出现 java.util.EmptyStackException stack.push(help.pop());//当满足help不为空,且help的元素小于pop(这样排出的顺序顶到底是从小到大的) } //将help里的元素返回到stack中 help.push(pop);//无论什么情况,只要stack不为空,都将pop压入help } while(!help.isEmpty()) {//当help不为空的时候,help里面的元素顶到底是从小到大的, stack.push(help.pop());//所以将help弹到stack中是顶到底是从大到小的 } } //最后控制台输出:5,4,2, 证明我们的排序成功了。 }
过程:
①首先help为空,那么直接将stack栈顶的元素4 pop出压入help
②stack不为空,继续将5弹出并保存到pop,比较pop和help里面的4,发现4小,将4返回到stack中,继续将5压入。
③stack不为空,继续将4弹出,和5比较,不满足4>5,接着讲4压入。
④接着同上将2压入。
⑤最后将help内元素弹出压入到stack中。
总结:想让stack自上而下从大到小,所以要将help里自上而下从小到大,每次都将stck(不为空的时候)里的元素弹出并压入help,但是对于已经压入的元素要和新压入的元素进行比较,若新压入的元素大,那么就得让已压入的元素返回到stack中进行重新压入help。这样就实现了help里面自上而下从小到大,也就实现了stack里面自上而下从大到小。
参考文献:《程序员代码面试指南》
相关文章推荐
- 怎样编写一个程序,把一个有序整数数组放到二叉树中? 编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?
- C++ 使用一个栈实现另一个栈的排序
- 004使用一个栈对另一个栈完成排序(C++实现)
- 用一个栈实现另一个栈的排序
- 对一道“写一个算法实现字符串逆序存储,要求不另设串存储空间.”题目的总结!
- 每日一道算法题2——定义一个栈,提供一个返回栈里最小元素方法
- 用一个栈实现另一个栈的排序
- 每日一道算法题:编程实现两个数的除法,当然不能用除法操作符
- 1_5用一个栈实现另一个栈的排序
- 每日一个算法------二叉树实现、递归和非递归算法(c++版)
- 实现能够返回最小值元素的栈(每日一道算法题)
- 栈和队列——用一个栈实现另一个栈的排序
- 用栈实现队列(每日一道算法题)
- 用一个栈来实现另一个栈的排序
- 数据结构5 用一个栈实现另一个栈的排序
- 每日一道算法题1 ——把二元查找树转变成排序的双向链表
- 用一个栈实现另一个栈的排序
- 程序员代码面试指南--用一个栈实现另一个栈的排序
- 用递归函数和栈操作逆序一个栈(每日一道算法题)
- 每天一个数据结构——三种简单排序算法及Java实现