【算法题】05-用一个栈实现另一个栈的排序

chenfei0 2020-03-06

题目

一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序?

思路

将要排序的栈记为stack,申请的辅助栈记为help,在stack上执行pop操作,弹出的元素记为cur.

  • 如果cur小于或等于help的栈顶元素,则将help直接压入help
  • 如果cur大于help的栈顶元素,则将help的元素逐一弹出。逐一压入stack,直到cur小于或等于help的栈顶元素,再将cur压入help

一直执行以上操作,直到stack中的全部元素都压入到help,最后将help中的所有元素逐一压入stack,即完成排序。

实现

代码

package com.zixin.learn;

import java.util.Stack;
/**
 * @Desc 用一个栈实现另一个栈的排序  只允许申请一个栈 不允许申请另外的数据结构
 * @author sangliping
 *
 */
public class StackSortStack {

    public static void sortStackByStack(Stack<Integer> stack) {
        //申请一个help栈
        Stack<Integer> help = new Stack<Integer>();
        //数据栈不空的时候
        while (!stack.isEmpty()) {
            //获得栈顶
            int cur = stack.pop();
            //如果help的数据不为空,并且help的栈顶元素小于当前元素
            while (!help.isEmpty() && help.peek() < cur) {
                //将help的元素放入stack
                System.out.println(help.peek()+"小于"+cur +"将help的元素放入stack");
                stack.push(help.pop());
            }
            //help为空  或者help的栈顶大于等于当前元素 当前元素放入help栈中
            System.out.println((help.isEmpty())?"为空将"+cur+"放入help":help.peek()+"大于等于"+cur +"将"+cur+"放入help");
            help.push(cur);
        }
        //help不为空的时候,将help的元素放入stack中
        while (!help.isEmpty()) {
            stack.push(help.pop());
        }
    }

    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<Integer>();
        stack.push(3);
        stack.push(1);
        stack.push(6);
        stack.push(2);
        stack.push(5);
        stack.push(4);
        sortStackByStack(stack);
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());

    }

}

输出

为空将4放入help
4小于5将help的元素放入stack
为空将5放入help
5大于等于4将4放入help
4大于等于2将2放入help
2小于6将help的元素放入stack
4小于6将help的元素放入stack
5小于6将help的元素放入stack
为空将6放入help
6大于等于5将5放入help
5大于等于4将4放入help
4大于等于2将2放入help
2大于等于1将1放入help
1小于3将help的元素放入stack
2小于3将help的元素放入stack
4大于等于3将3放入help
3大于等于2将2放入help
2大于等于1将1放入help
6
5
4
3
2
1

相关推荐