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

题目描述

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

image

分析

我们知道递归实质也是一种栈,要通过递归来实现压入5、4、3、2、1,那么递归中获得这些数据的顺序应该是1、2、3、4、5,也就是需要依次获得原栈的栈底元素。

而获得栈底元素也可以通过另一个递归来实现。

于是我们可以通过两个递归函数来实现整个过程:

public class Solution {
    public int getLast(Stack<Integer> s) {
        int current = s.pop();
        if(s.isEmpty()) {
            return current;
        }
        else {
            int last = getLast(s);
            s.push(current);
            return last;
        }
    }
    public void reverse(Stack<Integer> s) {
        if(s.isEmpty()) {
            return;
        }
        else {
            int current = getLast(s);
            reverse(s);
            s.push(current);
        }
    }
}

函数getLast来获得原栈的栈底元素,将栈底元素从原栈中删除且不破坏其他元素。

函数reverse依次获得栈底元素,通过递归特性将最先获得的元素最后压入,最后获得元素最先压入。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,727评论 1 19
  • 本题来自程序员代码面试指南 题目 一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这...
    624c95384278阅读 874评论 0 1
  • 我是一个姑娘,我不漂亮,我不出众,我没有什么特长,但我足够真诚,我坚信距离产生美,我信仰,18岁,经过一个成人礼,...
    路路的大世界阅读 351评论 0 0
  • 今天欣怡的背诵作业没完成,在家中自己背了一上午,下午学舞蹈我也让带着古诗书,可是效果不好,明天改变方式,...
    若尘_27ac阅读 140评论 0 0
  • 在地球上,最早的生物应当是名为蓝藻的类群,它们进化出能够进行光合作用的特性。它们在海底形成巨大薄层,有时也会形成被...
    老珂珂阅读 731评论 0 0