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

题目

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

思路

将要排序的栈记为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

原文地址:https://www.cnblogs.com/dream-to-pku/p/12426413.html