首页 > 其他分享 >用递归函数和栈操作逆序栈

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

时间:2022-09-30 22:11:43浏览次数:70  
标签:递归函数 int top 元素 栈底 操作 stack 逆序

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

作者: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;
        }
    }
}

更多

算法和数据结构笔记

标签:递归函数,int,top,元素,栈底,操作,stack,逆序
From: https://www.cnblogs.com/greyzeng/p/16746395.html

相关文章

  • devops学习笔记-jenkins实现基础CI/CD操作
    在之前的devops工具链中完成了jenkins以及gitlab配置之后,可以实现基础的CI/CD操作。操作流程整体的操作的流程如下所示:在开发环境配置好代码之后,将代码上传到gitlab,jenkins......
  • (大表小技巧)有时候 2 小时的 SQL 操作,可能只要 1 分钟
      关于一张5亿数据表之我与DBA的battle 发了之后,有好几个小伙伴来问我SQL是怎么拆的。这篇我们来简单盘下,其实拆SQL是因为涉及大表删除的问题。比如,你现在......
  • macOS 上 常用的操作
    首先mac上若使用的是windows的键盘,那么需要把ctrl键,设置成cmd键,因为mac上大多数操作都是基于cmd键。1.将ctrl键,修改为cmd键,这样后复制、粘贴、剪切、全选等ctrl+n......
  • 加工中心刀库复归及刀库表刷新操作
    立式加工中心刀库复归及刀库表刷新操作这种操作久经考验干什么?主要用于:1、换刀过程中系统出现报警,刀臂卡刀了怎么办?2、换刀过程中按了复位或急停,刀臂甩出停在一半怎么办?3、......
  • 字典,元组,集合相关操作,字符编码(理论
    目录字典,元组,集合相关操作,字符编码(理论)今日内容概要今日内容详细字典相关操作元组相关操作集合相关操作字符编码理论字符编码实操字典,元组,集合相关操作,字符编码(理论)今日......
  • 数控车削中心的操作
    当选择空运转状态时,自动进给操作的F码无效,执行mm/min的进给量。主轴的转速由手动数据输入或程序中的S码指令决定。此开关在任何工作状态下均起作用。“MDI”状态:即手动数据输......
  • 【操作系统-IO管理】IO层次结构
    目录1用户层I/O软件1.1假脱机技术(SPOOLing技术)1.1.1SPOOLing系统的组成1.1.2假脱机管理进程的工作原理1.2应用程序接口1.2.1字符设备接口1.2.2块设备接口1.2.3......
  • 工业智能网关BL110串口采集西门子PLC S7-200操作步骤
    COM口采集西门子PLC的配置4个COM口的配置内容一样,COM1固定为RS232,COM2、COM3和COM4是RS232/RS485可选串口(默认为RS485)。因S7-200的COM是RS485接口,则选择以COM2连接为例说明C......
  • 数据类型的常用操作和内置方法-下
    数据类型的常用操作和内置方法下字典内置方法类型转换字典的类型转换要求苛刻,一般不会使用dict([['key1',1],['key2',2]])#只能转换多元素的类型,且每个元素中还......
  • 数据内型方法与操作的补充
    目录一.字典dict的内置方法与操作1.类型转换2.字典必须掌握的操作1.按k取值(不推荐使用)2.按内置方法get取值(推荐使用)3.修改值数据4.新增键值对5.删除数据6.统计字典中键......