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

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

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值