用一个栈实现另一个栈的排序

【题目】

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

【解答】​

 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 }

【运行结果】

每接触一个新领域,我就像一块掉进水里的海绵,四面八方的养分都让我不断充实。O(∩_∩)O~
原文地址:https://www.cnblogs.com/zhzcode/p/9574390.html