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

举报
牛哄哄的柯南 发表于 2022/06/28 13:38:48 2022/06/28
【摘要】 仅用递归函数和栈操作逆序一个栈

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

【题目】

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

【思路】

要求只能用递归函数实现,需要设计两个函数,函数一实现返回栈底元素并移除;函数二实现逆序栈,需要使用函数一。

说明:图片来自左神的程序代码面试指南,仅供学习使用。

函数一:

//返回栈底元素并移除
public static int getAndRemoveLastElement(Stack<Integer> stack){
    int res = stack.pop();
    if(stack.isEmpty()){
        return res;
    }else{
        int last = getAndRemoveLastElement(stack);
        stack.push(res);
        return last;
    }
}

image-20220622105820761

函数二:

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

image-20220622105856058

【代码】

package keafmd.accumulate.codeinterviewguide.reversestack;

import java.util.Stack;

/**
 * Keafmd
 *
 * @ClassName: ReverseStack
 * @Description: 使用函数逆序栈
 * @author: 牛哄哄的柯南
 * @date: 2022-06-22 11:01
 */
public class ReverseStack {
    //返回栈底元素并移除
    public static int getAndRemoveLastElement(Stack<Integer> stack){
        int res = stack.pop();
        if(stack.isEmpty()){
            return res;
        }else{
            int last = getAndRemoveLastElement(stack);
            stack.push(res);
            return last;
        }
    }

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

    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        for(int i=1;i<=5;i++){
            stack.push(i);
        }
        System.out.print("逆序前:");
        while (!stack.isEmpty()){
            System.out.print(stack.pop()+" ");
        }
        System.out.println();
        for(int i=1;i<=5;i++){
            stack.push(i);
        }
        reverse(stack);
        System.out.print("逆序后:");
        while (!stack.isEmpty()){
            System.out.print(stack.pop()+" ");
        }
        System.out.println();
    }
}

效果:

逆序前:5 4 3 2 1 
逆序后:1 2 3 4 5 

Process finished with exit code 0
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。