zoukankan      html  css  js  c++  java
  • 每日一题 为了工作 2020 0305 第三题

    /**
    * 问题:
    * 如何仅适用递归函数和栈操作逆序一个栈
    * 一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这个栈转置后,
    * 从栈顶到栈底为5、4、3、2、1,也就是实现了栈中元素的逆序,但是只可以通过递归函数来实现。
    * 分析:
    * 本题目考验查找操作和递归函数的设计,我们需要设计出两个递归函数。
    * 函数一:将栈stack中的栈底元素返回并移除
    * getAndRemoveLastElement()
    * 函数二:逆序一个栈
    * @author 雪瞳
    *
    */

    * 递归

    递归需要满足两个条件:

    1.反复调用自身。

    2.有跳出反复调用的出口。

    import java.util.Stack;
    
    public class TransStack {
            //将stack栈中的栈底元素返回并移除
            public static int getAndRemoveLastElement(Stack<Integer> stack) {
                //将栈顶元素输出并删除,将结果存在result中
                int result = stack.pop();
                if(stack.isEmpty()) {
                    return result;
                }else {
                    //递归调用直到调用至可以获得result,即可以将栈底元素返回
                    int last = getAndRemoveLastElement(stack);
                    stack.push(result);
                    return last;
                }
            }
            //逆序一个栈
            public static void reverseStack(Stack<Integer> stack) {
                if(stack.isEmpty()) {
                    return;
                }
                int i = getAndRemoveLastElement(stack);
                //此时的stack和传入的形参之间相差一个栈底元素
                reverseStack(stack);
                stack.push(i);
            }
            public static void main(String[] args) {
                //创建栈对象
                Stack<Integer> stack = new Stack<>();
                //向栈内添加元素
                for(int i=1;i<=5;i++) {
                    stack.push(i);
                }
                TransStack test = new TransStack();
                test.reverseStack(stack);
                test.printCallStack(stack);
            }
            
            //打印栈中元素
            public static void printCallStack(Stack<Integer> stack) {
                if(stack.isEmpty()) {
                    return;
                }else {
                    int result = stack.pop();                
                    printCallStack(stack);
                    System.out.println(result);
                }        
            }
                
    }
  • 相关阅读:
    VC++ 之 文件操作
    Delphi7 API(5) 消息篇:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE
    VC++ 之 输入/输出类库(二)
    VB 访问控制面板
    Delphi7 API(4) 消息_重绘
    Lisp简明教程
    一次快速排序错误引发的思考(2)
    一次快速排序错误引发的思考(1)
    Common Lisp编译程序的小技巧
    暴风影音5免去广告的小技巧
  • 原文地址:https://www.cnblogs.com/walxt/p/12419549.html
Copyright © 2011-2022 走看看