首页 > 其他分享 >栈Stack——递归替身?

栈Stack——递归替身?

时间:2024-09-12 09:51:13浏览次数:12  
标签:node 调用 递归 stack 链表 替身 Stack

 

对于Stack这个集合类,由类继承关系可知是Vector的子类,根据push入栈方法跟踪代码,可知Vector是一个线程安全的类(高并发场景下使用,那可能不是一个好的选择)

 

 

看到这里,显然可以得知Stack入栈出栈的大致原理,就是Vector的elementData对象数组,用来储存数据,入栈时依次存放,出栈时倒序从数组中取出即可

 

 

单向链表反转打印这样的场景中,我们可以很自然地想到使用递归来实现,相比递归我们可以使用Stack类依次将单向链表的Node节点存放至Stack的对象数组中,然后反向出栈取出即可。

 

    public void reversePrint(Node node) {
        Stack<Node> stack = new Stack<>();
        while (node != null) {
            stack.push(node);
            node = node.next;
        }
        while (!stack.isEmpty()) {
            System.out.println(stack.pop());
        }
    }

    public void recursion(Node node) {
        if (node.next != null) {
            recursion(node.next);
        }
        System.out.println(node);
    }

 

显然,在链表中节点元素较多的场景下,使用Stack的方案明显所需的memory更少。我们可以根据这个简单的示例,在递归场景下优先考虑Stack方案的可能性~(使用了数据结构来优化:方法调用所需要的内存空间)

 

当程序执行一个方法时,它会在调用栈上创建一个新的栈帧(Stack Frame)。这个栈帧包含了执行该方法所需的所有信息。当方法执行完毕并准备返回时,它的栈帧会从调用栈中弹出,控制权返回给调用者。

对于递归方法,每次递归调用都会创建一个新的栈帧,并将其推入调用栈中。如果递归调用过深,即调用栈中的栈帧数量超过了系统或JVM(Java虚拟机)等环境为调用栈分配的内存限制,就会发生栈溢出错误(StackOverflowError)。

 

标签:node,调用,递归,stack,链表,替身,Stack
From: https://www.cnblogs.com/ashet/p/18409599

相关文章

  • leetcode刷题day13|二叉树Part01(递归遍历、迭代遍历、统一迭代、层序遍历)
    递归遍历思路:使用递归的方式比较简单。1、递归函数的传参:因为最后输出一个数组,所以需要传入根节点和一个容器,本来想写数组,但发现长度不能确定,所以选择list。2、终止条件:当访问的节点为空时,return3、递归函数的逻辑:先访问一个节点,递归访问其他节点144.二叉树的前序遍历......
  • leetcode刷题day14|二叉树Part02(以递归方法为主:226.翻转二叉树、101. 对称二叉树、104
    226.翻转二叉树思路:利用先序遍历递归翻转1、终止条件:节点为空,return2、参数:root3、递归函数逻辑:处理中间节点,交换;递归左孩子,递归右孩子代码如下:classSolution{publicTreeNodeinvertTree(TreeNoderoot){if(root==null)returnroot;swapC......
  • 递归(c++)
    递归1、斐波那契额数列基础代码#include<iostream>usingnamespacestd;intf(intn){ if(n==1)return1; if(n==2)return2; returnf(n-1)+f(n-2);}intmain(){ intn; cin>>n; cout<<f(n)<<endl; return0;}递归实现指数......
  • 函数递归的学习1
    了解递归递归是什么1.在C语言中,递归就是函数自己调用自己。递归的思想把⼀个大型复杂问题层层转化为⼀个与原问题相似,但规模较小的子问题来求解;直到子问题不能再被拆分,递归就结束了。所以递归的思考方式就是把大事化小的过程。递归中的递就是递推的意思,归就是回归的意思。......
  • C++模拟实现stack和queue(容器适配器)
    适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。简单理解,将模板参数给成容器,就是容器适配器,写成参数的容器的各种接口,均满足需要。#include<list>#includ......
  • 为什么Java已经不推荐使用Stack了?
    为什么不推荐使用StackJava已不推荐使用Stack,而是推荐使用更高效的ArrayDeque为什么不推荐使用性能低:是因为Stack继承自Vector,而Vector在每个方法中都加了锁。由于需要兼容老的项目,很难在原有的基础上进行优化,因此Vector就被淘汰掉了,使用ArrayList和CopyOnWriteAr......
  • openstack搭建
    基础环境准备一下操作2个节点都要做,单独的会标识的1、修改主机名[root@controller~]#vim/etc/hosts127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain6......
  • java 递归
    java递归目录java递归1递归概念2递归的基本使用3示例:递归求阶乘1递归概念以编程的角度来看,递归指的是方法定义中调用方法本身的现象把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解递归策略只需少量的程序就可描述出解题过程所需要的多次重复计......
  • saltstack使用介绍
    saltstack使用介绍saltstack是什么早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护。系统管理员面临的问题主要是1、系统配置管理,2、远程执行命令,因此诞生了很多开源软件,系统维护方面有fabric、puppet、chef、ansible、saltstack等,这些......
  • Cooley-Tukey FFT算法的非递归实现
    一维情况#include<iostream>#include<complex>#include<cmath>constdoublePI=3.14159265358979323846;//交换位置voidswap(std::complex<double>&a,std::complex<double>&b){std::complex<double>temp=a......