左程云代码面试指南:仅使用递归函数和栈实现一个逆序栈

原创 2016年10月08日 01:07:44

仅使用递归函数和栈实现一个逆序的栈

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


【解答】:

主要是查栈的操作和递归函数的设计,我们设计两个递归函数:

1.获取栈底元素并且从栈底移除它


public static int getAndRemoveLastElement(Stack<Integer> stack) {
    int result = stack.pop();
    if(stack.isEmpty()) {
        return result;
    } else {
        int last = getAndRemoveLastElement(stack);
        stack.push(result);
        return last;
    }       
}

2.逆序一个栈


public static void reverse(Stack<Integer> stack) {
    if(stack.isEmpty()) {
        return;
    }
    int i = getAndRemoveLastElement(stack);
    reverse(stack);
    stack.push(i);
}

完整代码如下:
ReverseStack.java

package com;

import java.util.Stack;

/*
 * 实现一个逆序功能的栈
 */
public class ReverseStack {

    //在不改变栈中元素顺序情况下,获取当前栈中栈底元素
    public static int getAndRemoveLastElement(Stack<Integer> stack) {
        int result = stack.pop();
        if(stack.isEmpty()) {
            return result;
        } else {
            int last = getAndRemoveLastElement(stack);
            stack.push(result);
            return last;
        }       
    }

    //逆序一个栈
    public static void reverse(Stack<Integer> stack) {
        if(stack.isEmpty()) {
            return;
        }
        int i = getAndRemoveLastElement(stack);
        reverse(stack);
        stack.push(i);
    }
}

Test.java
package com;

import java.util.Stack;

public class Test {

    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<Integer>();
        for(int i=1; i<5; i++) {
            stack.add(i);
        }
        for(int i=0; i<4; i++) {
            System.out.print("--" + stack.get(i));
        }
        System.out.println("");

        ReverseStack.reverse(stack);
        for(int i=0; i<4; i++) {
            System.out.print("--" + stack.get(i));
        }
    }
}

结果如下:

版权声明:本文为博主原创文章,未经博主允许不得转载。

左神的书——《程序员代码面试指南》之设计一个有getmin功能的栈 c++实现

题目: //实现一个特殊的栈,在实现栈的基本功能的基础上, //再实现返回栈中最小元素的操作。 //1.pop,push,getMin操作的时间复杂度都是o(1) //2 设计的栈类型可以使用...
  • hj605635529
  • hj605635529
  • 2017年01月01日 22:59
  • 458

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

牛客网上讲的一道题,学会这道题将对递归有更进一步的理解。 (视频链接:http://www.nowcoder.com/discuss/1944 ) 题目: 一个栈依次压入1,2,3,4,...
  • defineYouMyHeart
  • defineYouMyHeart
  • 2015年09月05日 20:09
  • 1111

栈和队列(3)--如何仅用递归函数和栈操作逆序一个栈

要求: 一个栈依次压入1、2、3、4、5,即从栈顶到栈底分别为5、4、3、2、1。将这个栈转置之后,从栈顶到栈底为1、2、3、4、5,也就是完成栈的逆序。 只能用递归函数来实现,不能使用其他的数据结构...
  • hzd12368
  • hzd12368
  • 2016年09月26日 22:01
  • 386

仅用递归函数和栈逆序一个栈

package stackAndQueue; import java.util.Stack; import org.junit.Test; /** * 仅用递归函数和栈逆序一个栈:Revers...
  • u010887744
  • u010887744
  • 2016年01月09日 23:40
  • 1935

栈和队列之仅用递归函数和栈操作逆序一个栈

import java.util.Stack; /** * recursion 递归的意思 * @author chenyu * 题目:仅用递归函数和栈操作逆序一个栈,列如一次压入1、2、3、...
  • u011068702
  • u011068702
  • 2015年11月22日 23:57
  • 1440

只用递归函数和栈操作实现一个栈的逆序

//仅用递归函数和栈操作逆序一个栈 //需要实现两个递归函数,一个用来返回并移除栈底元素,另一个递归函数就是逆序函数 #include class Solution { public:     i...
  • GuFanYuan
  • GuFanYuan
  • 2015年09月21日 21:48
  • 546

针对左程云《程序员代码面试指南》一类说明

之所以将左程云《程序员代码面试指南》单独分为一类,是因为我打算将其书中知识点以及编程题目系统的刷上一遍,但是由于书中的默认实现都是Java代码,搜索了网上也没有比较全的整本书的C++代码实现,故打算从...
  • u014465639
  • u014465639
  • 2017年04月10日 22:21
  • 596

左神的书——《程序员代码面试指南》之最大01子矩阵的大小 c++实现

//题目: //给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1的数量。 //  1  0  1  1 //  1  1  1  1 //  1...
  • hj605635529
  • hj605635529
  • 2017年01月02日 17:55
  • 931

《程序员代码面试指南》Python实现(个人读书笔记)

说明  最近一直在读左神的书——《程序员代码面试指南—IT名企算法与数据结构题目最优解》,为了记录自己的学习成果,并且方便以后查看,将自己读书时的想法与使用python实现的代码记录在此博客。   ...
  • qq_34342154
  • qq_34342154
  • 2017年09月09日 21:57
  • 1139

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

题目描述一个栈依次压入1,2,3,4,5那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现了栈中元素的逆序,请设计一个算法实现逆序栈的操作,但是只能...
  • bleuesprit
  • bleuesprit
  • 2016年03月20日 21:46
  • 428
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:左程云代码面试指南:仅使用递归函数和栈实现一个逆序栈
举报原因:
原因补充:

(最多只允许输入30个字)