栈系列之 栈排序

算法专题导航页面


【算法专题 - 栈】

  1. 栈系列之 栈排序
  2. 栈系列之 最小栈的实现
  3. 栈系列之 用栈实现队列
  4. 栈系列之 递归实现一个栈的逆序

【题目】
   使用一个辅助栈完成原始栈的排序:栈顶到栈底从大到小。

【其他限制】
  允许使用一个辅助栈,可以申请变量,但不能使用其他数据结构。

【图示】
在这里插入图片描述
【分析】
  类似汉诺塔问题,元素需要在原始栈和辅助栈之间来回出栈、入栈。首先将原始栈中元素出栈,然后条件性压入辅助栈,当新出栈元素不满足压入辅助栈条件时,可以考虑将辅助栈中元素出栈,重新压入原始栈,以此完成辅助栈中元素顺序的调换。

【解决方案】
  假设待排序栈标价为Stack,辅助栈的标记为SortedStack.首先,Stack栈的栈顶元素(标记为curElement)出栈,然后尝试将其压入SortedStack栈,但需要遵从以下限制:

  1. SortedStack栈为空,直接压入;
  2. SortedStack栈非空,且curElement <= SortedStack.peek(),将curELement压入;
  3. SortedStack栈非空,但curElement > SortedStack.peek(),此时需要持续弹出SortedStack栈的顶元素直至元素curElement <= SortedStack栈最新的顶元素。

  本题所示的序列2, 0, 1, 9排序过程如下所示:

  1. Stack栈前两个元素2, 0出栈并压入SortedStack。
    在这里插入图片描述
  2. Stack栈第三个元素1出栈,因其大于SortedStack栈当前栈顶元素0,故需要SortedStack栈元素依次出栈,并压入Stack栈。
    在这里插入图片描述
    在这里插入图片描述
  3. Stack栈新添加元素0出栈并压入SortedStack。
    在这里插入图片描述
  4. Stack栈最后一个元素9出栈,其是所有元素中的最大值,故需要SortedStack栈中所有元素出栈并压入Stack栈。
    在这里插入图片描述
    在这里插入图片描述
  5. Stack栈中剩余元素依次出栈并依次压入SortedStack栈。
    在这里插入图片描述
  6. 将SortedStack栈中的有序元素依次出栈并依次压入原始栈Stack。
    在这里插入图片描述
    【代码实现】
/*
 * DESC:
 * Sort a stack only uses another stack, a variable is optionnal.
*/
 public void sortStack(Stack<Integer> stack) {
     Stack<Integer> sortedStack = new Stack<Integer>();
     int curElement = 0;
     while (!stack.Isempty()) {
         curElement = stack.pop();
         while (!sortedStack.IsEMpty() && curElemennt > sortedStack.peek()) {
             stack.push(sortedStack.pop());
         }
         sortedStack.push(curElement);
     }
     while (!sortedStack.IsEmpty()) {
         stack.push(sortedStack.pop());
     }
 }
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值