zoukankan      html  css  js  c++  java
  • 如何仅用递归函数和栈操作逆序一个栈——你要先用stack实现,再去改成递归——需要对递归理解很深刻才能写出来

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

    方法一:

    既然是递归,第一反应是采用两个栈实现该功能实现,依次弹出栈顶元素,然后压入另外一个栈中,代码如下:
        import java.util.Stack;
      
        public class StackReverse0 {
            private Stack<Integer> stack0;
            private Stack<Integer> stack1;
            
            public StackReverse0(){
                stack0 = new Stack<Integer>();
                stack1 = new Stack<Integer>();
            }
            public void getLastElement(){
                Integer pop = stack0.pop();
                stack1.push(pop);
                if(!stack0.isEmpty())
                    getLastElement();
            }
            
            public static void main(String[] args) {
                StackReverse0 sr = new StackReverse0();
                sr.stack0.add(1);
                sr.stack0.add(2);
                sr.stack0.add(3);
                sr.stack0.add(4);
                sr.stack0.add(5);
                
                sr.getLastElement();
                
                System.out.println(sr.stack1.pop());
                System.out.println(sr.stack1.pop());
                System.out.println(sr.stack1.pop());
                System.out.println(sr.stack1.pop());
                System.out.println(sr.stack1.pop());
            }
        }

    方法2:类似两个stack的思路,不过是使用一个stack搞定。

    import java.util.Stack;
    public class StackReverse {
        public static int getAndRemoveLastElement(Stack<Integer> stack){ //负责删除stack bottom的一个元素,并返回
            int result = stack.pop();
            if(stack.isEmpty()){
                return result;
            }else{
                int last = getAndRemoveLastElement(stack);
                stack.push(result);  // stack还原
                return last;
            }
        }
        
        public static void reverse(Stack<Integer> stack){
            if(stack.isEmpty()){
                return;
            }
            int i = getAndRemoveLastElement(stack);
            reverse(stack);
            stack.push(i); // 效果就是依次将stack top的元素入栈,最后效果就是stack元素逆序
        }
        
        public static void main(String[] args) {
            Stack<Integer> stack = new Stack<Integer>();
            stack.push(1);
            stack.push(2);
            stack.push(3);
            stack.push(4);
            stack.push(5);
            reverse(stack);
            System.out.println(stack.pop());
            System.out.println(stack.pop());
            System.out.println(stack.pop());
            System.out.println(stack.pop());
            System.out.println(stack.pop());
        }
    }

  • 相关阅读:
    函数匹配
    特殊用途语言特性——默认参数、内联函数和constexptr函数
    函数重载
    返回数组指针的4种函数写法
    返回数组引用的4种函数写法
    返回类型和return语句
    exception is the version of xbean.jar correct
    window.location
    plsql 导出查询结果
    plsql 如何导入excel数据?
  • 原文地址:https://www.cnblogs.com/bonelee/p/10074960.html
Copyright © 2011-2022 走看看