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

原创 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));
        }
    }
}

结果如下:

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

相关文章推荐

二叉树问题---判断t1树中是否有与t2树拓扑结构完全相同的子树

说明: 两种方法: 方法1: 对于t1的每棵子树,都去判断是否与t2树的拓扑结构完全一样,这个过程的实践复杂度是O(M),t1的子树共有N棵,所以时间复杂度为O(M*N) 方法2: 首先把t...

二叉树问题---二叉树的前中后序的递归,非递归及Morris遍历

class TreeNode: def __init__(self, x): root.val = x root.left = None roo...

程序员代码面试指南 左程云

  • 2017年10月20日 09:35
  • 8.9MB
  • 下载

程序员代码面试指南 左程云著

  • 2017年06月22日 23:24
  • 61.87MB
  • 下载

左程云面试算法学习——1.使用双栈(stack),获取当前序列最小值

获取序列中的最小值。
  • hymanxq
  • hymanxq
  • 2015年11月30日 23:35
  • 1222

程序员代码面试指南(左程云).pdf

  • 2017年11月10日 09:32
  • 80.91MB
  • 下载

递归和动态规划专题(二)----剑指offer+左程云算法

递归和动态规划专题(二)—-剑指offer+左程云算法

《程序员代码面试指南 IT名企算法与数据结构题目最优解》左程云著 pdf

下载地址:网盘下载 内容简介  · · · · · · 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:左程云代码面试指南:仅使用递归函数和栈实现一个逆序栈
举报原因:
原因补充:

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