zoukankan      html  css  js  c++  java
  • 如何仅用递归函数和栈操作逆序一个栈

    【题目】​

           一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他的数据结构。

    【解答】

            ​首先分为两步。第一步,得到栈底元素并移除这个栈底元素;第二步,将得到的栈底元素逆序入栈。

    【代码】

     1 package cn.hl.p3;
     2 
     3 import java.util.Stack;
     4 
     5 /**
     6  * title:一个栈依次压入1、2、3、4、5,
     7  *       那么从栈顶到栈底分别为5、4、3、2、1。
     8  *       将这个栈转置后,从栈顶到栈底为1、2、3、4、5,
     9  *       也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他的数据结构。
    10  *
    11  * @author 猩生柯北
    12  */
    13 
    14 public class suanfa {
    15     /**
    16      * 将栈stack的栈底元素返回并移除
    17      * @param stack
    18      * @return
    19      */
    20     public static int getAndRemoveLastElement(Stack<Integer> stack){
    21         //弹出栈顶元素
    22         int result = stack.pop();
    23         //判断
    24         //弹出元素后如果栈为空,则返回该元素
    25         if(stack.isEmpty()){
    26             return result;
    27         }else{
    28             //不为空时,则递归。此时栈为原栈弹出栈顶元素后的一个变化的栈。
    29             //当递归到栈底元素时,将栈顶元素返回并赋值给变量last
    30             int last = getAndRemoveLastElement(stack);
    31             //递归结束。将除栈底元素的其他元素按原先顺序依次入栈。
    32             //此时的栈与原栈的区别是:栈底元素被移除
    33             stack.push(result);
    34             //返回原栈底元素
    35             return last;
    36         }
    37     }
    38     
    39     /**
    40      * 逆序一个栈。
    41      * @param stack
    42      */
    43     public static void reverse(Stack<Integer> stack){
    44         //判断。
    45         if(stack.isEmpty()){
    46             return;
    47         }
    48         //得到栈底元素
    49         int i = getAndRemoveLastElement(stack);
    50         //递归。此时的栈是原栈返回并移除栈底元素的一个变化栈。
    51         reverse(stack);
    52         //递归结束。递归到栈空时,将得到的栈底元素依次(注意顺序!!!)入栈。
    53         stack.push(i);
    54     }
    55     
    56     //测试.入栈元素依次为:5,7,9.
    57     public static void main(String[] args) {
    58         Stack s1 = new Stack();
    59         s1.push(5);
    60         s1.push(7);
    61         s1.push(9);
    62         System.out.println("The elements in the original stack:");
    63         for( int i=0 ; i <= s1.size()+1; i++ ){
    64             System.out.println(s1.pop());
    65         }
    66         
    67         s1.push(5);
    68         s1.push(7);
    69         s1.push(9);
    70         reverse(s1);
    71         System.out.println("===================================");
    72         System.out.println("The elements in the changed stack:");
    73         for( int i=0 ; i <= s1.size()+1; i++ ){
    74             System.out.println(s1.pop());
    75         }
    76     }
    77 }
    78     

    【运行结果】

    每接触一个新领域,我就像一块掉进水里的海绵,四面八方的养分都让我不断充实。O(∩_∩)O~
  • 相关阅读:
    w3c盒子模型与ie盒子模型
    前端入门
    连接数据库好用工具
    前端开发工具
    刚发现的取色工具
    使用val()另一个妙用------选中select/checkbox/radio的值
    z-index的妙用
    react生命周期函数
    react中虚拟dom的diff算法
    React中的虚拟DOM
  • 原文地址:https://www.cnblogs.com/zhzcode/p/9574375.html
Copyright © 2011-2022 走看看