【题目】
一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序?
【解答】
1 package cn.hl.p4; 2 3 import java.util.Stack; 4 5 /** 6 * 题目:一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序, 7 * 只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。 8 * 如何完成排序? 9 * 10 * 思想:题中给出了两个栈,我们可以将要排序的栈记为stack,辅助栈记为help。 11 * 要实现stack中的元素从顶到底按从大到小排序,则入栈的元素顺序应该为:从小到大。 12 * 所以,help栈中元素从顶到底要实现由小到大的顺序。那么这就是解题关键了, 13 * 我们只要实现这个就好。 14 * 15 * 步骤:在stack上执行pop操作,弹出的元素记为cur。 16 * 1.若cur小于或者等于help的栈顶元素,则将cur直接压入help。 17 * (!!!保持help从栈顶到栈底由小到大的顺序) 18 * 2.若cur大于help的栈顶元素(注意:若此时将cur压入help,则会违反help栈 19 * 顶到底由小到大的顺序),则将help的元素逐一弹出,逐一压入stack,直到cur小于 20 * 或者等于help的栈顶元素,再将cur压入help。 21 * 3.重复以上操作,直到stack中的全部元素都压入到help。最后将help中的所有 22 * 元素逐一压入stack,即完成排序。 23 * 24 * @author 猩生柯北 25 * 26 */ 27 public class Demo { 28 /** 29 * 用一个栈实现另一个栈的排序 30 * @param stack 31 */ 32 public static void sortStackByStack(Stack<Integer> stack){ 33 //辅助栈help 34 Stack<Integer> help = new Stack<Integer>(); 35 //判断。若stack不为空,则执行循环。 36 while(!stack.isEmpty()){ 37 //cur接收stack弹出的元素 38 int cur = stack.pop(); 39 while( !help.isEmpty() && help.peek() > cur){ 40 stack.push(help.pop()); 41 } 42 help.push(cur); 43 } 44 while(!help.isEmpty()){ 45 stack.push(help.pop()); 46 } 47 } 48 49 /** 50 * 测试 51 * @param args 52 */ 53 public static void main(String[] args) { 54 Stack s1 = new Stack(); 55 s1.push(5); 56 s1.push(6); 57 s1.push(7); 58 sortStackByStack(s1); 59 System.out.println(s1.pop()); 60 System.out.println(s1.pop()); 61 System.out.println(s1.pop()); 62 } 63 }