使用递归函数逆序一个栈

原题(来源:牛客网)

一个栈依次压入1,2,3,4,5那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现了栈中元素的逆序,请设计一个算法实现逆序栈的操作,但是只能用递归函数来实现,而不能用另外的数据结构。

解法

思想

设计一个函数getAndRemoveLastElement用于获取并移除栈底元素,当栈空的时候进行回溯,并将获取的元素压入栈,就能达到逆序的效果。

这样做的时间复杂度肯定是没一个辅助队列来的快的,好处是没有使用额外的空间(除了递归栈空间)

时间复杂度计算:设栈的大小为n,每一次获取栈底元素的时间复杂度是O(n),栈的大小要从n->0,就是O(n)+O(n-1)+O(n-2)+...+O(1)=O(n^2)

代码

class Solution {
    public void reverse(Stack<Integer> stack){
        if(stack.isEmpty()){
            return;
        }
        //每次获取栈底元素,最后一次获取的即是栈顶元素
        int i = getAndRemoveLastElement(stack);
        reverse(stack);
        //回溯的时候将获取的元素压入
        stack.push(i);
    }

    public int getAndRemoveLastElement(Stack<Integer> stack){
        //获取并移除栈顶元素
        int result = stack.pop();
        //获取栈底元素
        if(stack.isEmpty()){
            return result;
        }else{
            int last = getAndRemoveLastElement(stack);
            //回溯的时候将获取的元素压入
            stack.push(result);
            return last;
        }
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/%e4%bd%bf%e7%94%a8%e9%80%92%e5%bd%92%e5%87%bd%e6%95%b0%e9%80%86%e5%ba%8f%e4%b8%80%e4%b8%aa%e6%a0%88/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年4月19日
下一篇 2020年4月20日

相关推荐

  • leetcode494-目标和

    原题 给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。…

    算法 2019年12月12日
    090
  • leetcode102-二叉树的层次遍历

    原题 给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。 例如:给定二叉树: [3,9,20,null,null,15,7],  &nbsp…

    算法 2020年1月11日
    0120
  • leetcode202-快乐数

    原题 编写一个算法来判断一个数是不是“快乐数”。 一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无…

    算法 2019年12月18日
    0120
  • leetcode134-加油站

    原题 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[…

    算法 2020年2月16日
    0100
  • leetcode680-验证回文字符串II

    原题 给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。 示例 1: 输入: "aba" 输出: True 示例 2: 输入: "abca" 输出: True 解…

    算法 2020年5月19日
    0290
  • 海量数据-两种方法解决top k问题

    假如提供一百万个数据(甚至更大)的无序数组,如何从中获取最大的k个元素? 最容易想到的是先降序排序然后获取前k个元素,那假设我们用最常用的O(nlogn)级别的排序算法,要获取to…

    2020年4月4日
    0230
  • leetcode128-最长连续序列

    原题 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长…

    算法 2020年6月6日
    090
  • leetcode4-寻找两个有序数组的中位数

    这道题我没想出符合条件的思路 原题 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m…

    算法 2020年1月9日
    0620
  • leetcode53-最大子序和

    原题 原题 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4],…

    算法 2020年2月20日
    0150
  • leetcode42-接雨水

    原题 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高…

    2020年1月23日
    0320

发表回复

登录后才能评论