当前位置: 首页 > news >正文

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

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

作者:Grey

原文地址:

博客园:用递归函数和栈操作逆序栈

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

题目描述

请设计一个算法实现逆序栈的操作,但是只能用递归函数来实现,而不能用另外的数据结构。给定一个栈Stack以及栈的大小top,请返回逆序后的栈。

题目链接:牛客-用递归函数和栈操作逆序栈

首先,如果我们可以用递归函数实现这样的功能:获取一个栈的栈底元素并返回栈底元素,然后把栈底元素删除,并把剩余元素压下来,假设方法为int getBottom(stack, top)

示例图如下

假设原始栈如下

image

调用int getBottom(stack, top)获取栈底元素 h 并返回栈底元素,然后把栈底元素删除,并把剩余元素压下来,栈变成如下样子

image

然后递归调用原函数,将剩余部分逆序

image

最后将之前的栈底元素放到原来的栈顶

image

即完成了栈的逆序

整个算法我们可以通过如下方式来实现

// 逆序一个栈
    public  int[] reverseStackRecursively(int[] stack, int top) {
        if (top >= 1) {
            // 获取栈底元素
            int bottom = getBottom(stack, top);
            // 逆序除了栈底的剩余部分
            stack = reverseStackRecursively(stack, --top);
            // 栈底放栈顶
            stack[top] = bottom;
        }
        return stack;
    }

接下来就是int getBottom(stack, top)的实现,由于此方法要实现的功能是

  1. 返回栈底元素

  2. 删掉栈底元素

  3. 其余元素压下来

且该函数也需要通过递归来实现,base case 是top == 1的时候,栈只有一个元素

直接返回stack[0]

接下来是普遍情况,通过

int tmp = stack[--top];

获取栈顶元素

然后

int bottom = getBottom(stack, top);

获取栈底元素,bottom 即为要返回的元素

最后

stack[--top] = tmp;

栈顶元素下降一格,表示压下来这个动作。

完整代码如下

import java.util.*;

public class ReverseStack {
    public  int[] reverseStackRecursively(int[] stack, int top) {
        if (top >= 1) {
            // 获取栈底元素
            int bottom = getBottom(stack, top);
            // 逆序
            stack = reverseStackRecursively(stack, --top);
            // 栈底放栈顶
            stack[top] = bottom;
        }
        return stack;
    }

    public  int getBottom(int[] stack, int top) {
        if (top == 1) {
            return stack[0];
        } else {
            int tmp = stack[--top];
            int bottom = getBottom(stack, top);
            stack[--top] = tmp;
            return bottom;
        }
    }
}

更多

算法和数据结构笔记

相关文章:

  • java基于SpringBoot+Vue的学生选课作业系统 element
  • Excel数据分析
  • 机智云无需代码就能搞定IoT小程序开发和管理
  • RocketMQ 消费者拉取消息(Pull) 解析——图解、源码级解析
  • 字符串函数的详解
  • 【BOOST C++指针专题07】Boost.Pool
  • C# 文件/文件夹操作(文本写入,追加,覆盖,清空,文件/文件夹新建,复制,删除,移动)+驱动器+目录+路径+Path类大全
  • Less预处理——变量和嵌套
  • BEVerse 中数据集预处理代码浅析
  • 算法每日一题(合并两个有序的数组)
  • SpringBoot整合Swagger
  • ProcExp的利用
  • C++内存管理
  • 33、Java 异常掌握这些就够了(图解 Java 中的异常)
  • springboot-方法处理4-消息转换器
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • extract-text-webpack-plugin用法
  • Flannel解读
  • httpie使用详解
  • Laravel5.4 Queues队列学习
  • PHP CLI应用的调试原理
  • Redash本地开发环境搭建
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 扑朔迷离的属性和特性【彻底弄清】
  • 前端
  • 前端路由实现-history
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • $(function(){})与(function($){....})(jQuery)的区别
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (九十四)函数和二维数组
  • (离散数学)逻辑连接词
  • (一) storm的集群安装与配置
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .NET 反射 Reflect
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET处理HTTP请求
  • .Net各种迷惑命名解释
  • .NET开源快速、强大、免费的电子表格组件
  • /etc/motd and /etc/issue
  • @media screen 针对不同移动设备
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [2023-年度总结]凡是过往,皆为序章
  • [Android] Implementation vs API dependency
  • [Avalon] Avalon中的Conditional Formatting.
  • [EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件
  • [Java]快速入门优先队列(堆)手撕相关面试题
  • [leetcode 数位计算]2520. 统计能整除数字的位数
  • [NLP] 使用Llama.cpp和LangChain在CPU上使用大模型