用一个栈实现另一个栈的排序(每日一道算法题)

来源:互联网 发布:我国科研成果数据 编辑:程序博客网 时间:2024/04/29 18:22

要求:不能使用其他数据结构,只能使用一个栈加一个新的变量,实现对一个整数类型的栈排序。

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里面自上而下从大到小。

参考文献:《程序员代码面试指南》

阅读全文
1 0