美文网首页Android技术知识Android开发经验谈
如何仅用递归函数和栈操作逆序一个栈

如何仅用递归函数和栈操作逆序一个栈

作者: 624c95384278 | 来源:发表于2017-11-29 18:23 被阅读0次

本题来自程序员代码面试指南


题目

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

  • 递归函数一:将栈stack的栈底元素返回并移除


    递归函数一
  • 递归函数二:逆序一个栈,就是题目要求实现的方法,具体过程就是如下代码中的reverse方法。


    递归函数二
public class ReverseStack {

    /**
     * 将栈的栈底元素出栈返回
     * @param stack
     * @param <T>
     * @return
     */
    public static <T> T getAndRemoveLastElement(Stack<T> stack) {
        //讲一个值弹出栈
        T result = stack.pop();
        //栈空返回栈底元素
        if (stack.isEmpty()) {
            return result;
        } else {
            //在递归调用的过程中栈底元素始终保持在last里
            T last = getAndRemoveLastElement(stack);
            //调用返回,将非栈底元素重新压入栈中
            stack.push(result);
            return last;
        }
    }

    /**
     * 将栈逆序
     * @param stack
     * @param <T>
     */
    public static <T> void reverse(Stack<T> stack) {
        //递归调用的返回条件
        if (stack.isEmpty()) {
            return;
        }
        //返回栈中最后一个值
        T andRemoveLastElement = getAndRemoveLastElement(stack);
        reverse(stack);
        stack.push(andRemoveLastElement);
    }
}

递归看起来就像玄学,这个题在递归中套个递归,看上去就很有意思。
俩个递归分开看 ,第一个先将栈中元素弹出一个存到变量中,递归返回条件是弹出一个元素后栈空将栈底元素作为返回值返回,回到调用流程后将存在变量中的非栈底元素再次压入栈中;第二个的返回条件是栈空,而第二个每一步弹出的是栈底元素,通过这个方法实现栈的逆序。

最后附上github地址

相关文章

网友评论

    本文标题:如何仅用递归函数和栈操作逆序一个栈

    本文链接:https://www.haomeiwen.com/subject/dsspbxtx.html