zoukankan      html  css  js  c++  java
  • 用一个栈实现另一个栈的排序

    【题目】

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

    【解答】​

     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~
  • 相关阅读:
    在WPF中添加Windows Form控件
    LIST对象排序问题
    C# TreeView树节点上下移动
    C# listbox的上下移动,拖动排序,两个listbox相互拖动
    Nmap 扫描并生成HTML报告
    Windows 10 系统精简方案参考
    Windows10 子系统 Ubuntu安装
    VS2012 RC页面检查器
    新增功能.NET 框架 4.5 RC
    PowerPoint Storyboarding:Visual Studio 2012 RC带给开发者的秘密杀器
  • 原文地址:https://www.cnblogs.com/zhzcode/p/9574390.html
Copyright © 2011-2022 走看看