精华内容
下载资源
问答
  • 通常所说的压栈什么意思呢?
  • 1、函数执行流程(调用函数,保存当前的内容,压栈函数并创建栈帧。执行里面的语句)全局帧中生成foo1、foo2、foo3、main的函数对象。(栈,先进后出,后进先出)。main函数调用main 中查找内建函数print压栈,将常量...

    1、函数执行流程

    (调用函数,保存当前的内容,压栈函数并创建栈帧。执行里面的语句)

    全局帧中生成foo1、foo2、foo3、main的函数对象。(栈,先进后出,后进先出)。

    main函数调用

    main 中查找内建函数print压栈,将常量字符串压栈,调用函数,弹出栈顶。

    main中全局函数foo1压栈,将常量100,101压栈,调用函数foo1,创建栈帧。Print函数压栈,字符串和变量b、b1压栈,调用函数,弹出栈帧,返回值。

    Main中全局查找foo2函数压栈,将常量200压栈,调用foo2,创建栈帧。foo3函数压栈,变量c引用压栈,调用foo3,创建栈帧。foo3完成print函数调用后返回。foo2回复调用,执行print后,返回值。Main中foo2调用结束弹出栈顶,main函数继续执行print函数调用,弹出栈顶,main函数返回。

    2、递归:函数直接或者间接调用自身就是递归。

    递归需要有边界条件、递归前进段、递归返回段。

    递归一定要有边界条件。

    当边界不满足的时候递归前进。

    当边界条件满足的时候,递归返回。

    斐波那契数列:

    pre = 0

    cur = 1

    print(pre,cur,end = ' ')

    n=4

    for i in range(n-1):

    pre,cur = cur ,pre + cur

    print(cur,end=' ')

    def fib(n):

    return 1 if n<2 else fib(n-1)+fib(n-2)

    for i in range(5):

    print(fib(i),end=' ')

    3、递归要求

    递归一定要有退出条件,递归调用一定要执行到这个退出条件,没有退出条件的递归调用,就是无限调用。

    递归调用的深度不宜过深。

    Python中对递归调用的深度做了限制,以保护解释器。

    超过递归调用深度,会抛出异常的。

    4、递归的性能

    循环稍微复杂一些,但是只要不是死循环,可以多次迭代直至算到结果。

    改进。左边的fib函数和循环的思想类似。

    参数n是边界条件,用n来计数。

    上一次的计算结果作为下一次结果的实参。

    import datetime

    n=35

    start = datetime.datetime.now()

    def fib(n):

    return 1 if n<2 else fib(n-1)+fib(n-1)

    for i in range(n):

    print(fib(i),end='')

    delta = (datetime.datetime.now()-start).total_seconds()

    print(delta)

    效率比较低。

    pre = 0

    cur = 1

    print(pre,cur,end=' ')

    def fib(n,pre=0,cur=1):

    pre,cur = cur,pre + cur

    print(cur,end=' ')

    if n == 2:

    return

    fib(n-1,pre,cur)

    print(fib(5))

    #斐波那契数列改进方式

    左边的fib函数和循环的思想类似

    参数n是边界条件,用n来计数。

    上一次的计算结果作为函数的实参。

    效率很高

    和循环相比,性能相近,所以说递归效率不一定很低。但是深度有限。

    5、间接递归

    def  foo1():

    foo2()

    def  foo2():

    f1oo()

    foo1()

    是通过别的函数调用了函数本身。

    但是,如果构成了循环递归调用时非常危险。

    6、递归总结

    是一种很自然的表达,符合逻辑思维。

    相对运行效率较低,每次调用函数都要开辟栈帧

    递归有深度限制,如果递归层次太深,函数反复压栈,栈内存很快就溢出了。

    如果有限次数的递归,可以使用递归调用,或者使用循环替代,循环代码稍微复杂,但是只要不是死循环,可以多次迭代直至算出结果。

    绝大多数递归,都可以使用循环实现。

    即使代码很简单,但是能不用则不用递归。

    展开全文
  • 栈是什么意思

    2019-09-16 19:28:45
    向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 栈按照先进后出...

    栈,又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。

    向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

    栈按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
    在这里插入图片描述

    扩展资料:

    1、栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    2、栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

    另外,栈数据在多个线程或者多个栈之间是不可以共享的,但是在栈内部多个值相等的变量是可以指向一个地址的,详见第3点。

    堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

    展开全文
  • 说了这么多,还没说什么是内联函数。所谓内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度。现在该说Java了,对应...

    以前用过C++,知道它里面有一个内联函数这个概念,一般情况用inline关键字修饰,在C++定义类时,那种写中Class定义里面的函数,也被编译器当做内联函数处理。

    说了这么多,还没说什么是内联函数。所谓内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度。

    现在该说Java了,对应Java语言中也有一个关键字final来指明那个函数是内联的,例:

    Java代码  712b3cba1b66defef3600b7f4b170ee7.png

    public final void doSomething() {

    // to do something

    }

    该方法在被调用时,会在调用处直接展开使用,从而提高程序执行速度。此外final关键字还有一个作用,防止doSomething方法在子类中被覆盖,如果你希望doSomething是一个最终行为的话,那它应该被设计成final。

    内联不一定好,当被指定为内联的方法体很大时,展开的开销可能就已经超过了普通函数调用调用的时间,引入了内联反而降低了性能,因为在选择这个关键字应该慎重些,不过,在以后高版本的JVM中,在处理内联时做出了优化,它会根据方法的规模来确定是否展开调用。

    --------------------------------------------------------华丽的分界线-------------------------------------------------------

    5b19f9682e1d7aa3a067f67943b56dd9.png

    doug lea写类库是各种优化方法都会想到呀。

    展开全文
  • cdecl、pascal、stdcall、fastcall等修饰符号到底什么意思呢?非常简单,就是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是压入堆栈的内容由谁来清除,调用者还是函数自己?这些开关用来告诉编译器产生什么样...

    cdecl、pascal、stdcall、fastcall等修饰符号到底什么意思呢?
    非常简单,就是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是
    压入堆栈的内容由谁来清除,调用者还是函数自己?
    这些开关用来告诉编译器产生什么样的汇编代码。

    下面把区别列表如下:

    Directive Parameter order  Clean-up Passes parameters in registers?
     register  Left-to-right   Routine   Yes
     pascal   Left-to-right   Routine   No
     cdecl   Right-to-left   Caller    No
     stdcall   Right-to-left   Routine   No
     safecall  Right-to-left   Routine   No

    简单说明:

    __cdecl是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。__cdecl可以写成_cdecl。
            __stdcall调用约定用于调用Win32 API函数。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。__stdcall可以写成_stdcall。
            __fastcall约定用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。__fastcall可以写成_fastcall。 


    ·特别说明
    1. 在默认情况下,采用__cdecl方式,因此可以省略.
    2. WINAPI一般用于修饰动态链接库中导出函数
    3. CALLBACK仅用于修饰回调函数
     

    展开全文
  • 什么是栈?

    万次阅读 多人点赞 2019-05-08 10:57:59
    我常常会问自己的学生“栈”这个字的意思到底是什么?大家想到的多是客栈。我们翻翻字典也不难发现,栈的第一个释义是:储存货物或供旅客住宿的房屋。所以客栈的想法并没有错,但是这也未免太过抽象。 ...
  • 好记性不如烂笔头,仅以此记录 20200526 对象的创建过程 源码: class T{ int i = 8; } T t = new T(); ...汇编码的大概意思: ... 3 dup (压栈 一个对象引用,原栈中已存在一个) -->4...
  • 函数的执行需要对函数进行压栈的,什么压栈呢,简而言之就是在函数执行时在栈中创建栈帧存放需要变量以及指针的意思。具体涉及的知识非常多,这里就已一个Python脚本简单进行分析。 当我们运行上面代码时,它...
  • 1 函数的执行流程函数的执行需要对函数进行压栈的,什么压栈呢,简而言之就是在函数执行时在栈中创建栈帧存放需要变量以及指针的意思。具体涉及的知识非常多,这里就已一个Python脚本简单进行分析。当我们运行上面...
  • 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。... 这道题我开始都没看懂是什么意思,序列{1,2,3,4,5}压栈之后,出栈不就是{5...
  • 下面的 输出 一词表示将该值存起来(保存到要求的结果中),压栈 就是入栈的意思。 ①遇到操作数直接输出 ②遇到操作符:分种情况 1.栈为空时: 无论操作符是什么,直接压栈 2.新的操作符优先级比栈顶的高: 直接...
  • PASCAL不仅仅是语言

    2011-03-17 10:30:00
    如下: int PASCAL WinMain(...) { ......} WinMain函数前的PASCAL是什么意思呢? PASCAL是函数在调用时,针对参数的压栈约定(即参数从右向左压栈),函数返回时需要重新调整堆栈指针,对于WinMain函数是必须的 ...
  • 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。 假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某...什么意思呢?简单的说就是给你序列,让你通过一...
  • 递归 Java

    2015-06-07 18:23:58
    如果您还不太明白是什么意思,先看下面代码,想想结果是什么? public class test1{ static int i = 0; public static int test(){ while(i ){ i++; i = test(); } System.out.println
  • 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字...这道题卡了很久都不知道是什么意思。 下面结合代码讲解一下。 看弹出序列4 5321,说明最后一个...
  • cdecl、pascal、stdcall、fastcall等修饰符号2007-09-16 00:22cdecl、pascal、stdcall、fastcall等修饰符号到底什么意思呢? 非常简单,就是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是 压入堆栈的内容由...
  • 剑指offer (21)

    2020-02-06 17:35:38
    题目 : 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。...后来才好像明白是什么意思… 假设有一串数字要将他们压...
  • __cdecl

    千次阅读 2006-07-12 13:12:00
    cdecl、pascal、stdcall、fastcall等修饰符号到底什么意思呢?非常简单,就是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是压入堆栈的内容由谁来清除,调用者还是函数自己?这些开关用来告诉编译器产生什么样...
  • 以后调查

    2012-08-24 14:53:00
    dolphin-playerprof.c 中monstartup 不知道什么意思。留着慢慢啃。 参考资料 8.《系统程序员成长计划》Page108 栈是向下增长的,栈顶是低地址,栈底是高地址 C语言函数调用时,参数按值传递,并从最后一个参数...
  • c

    2021-04-16 00:55:40
    函数,知道了压栈,不知道什么意思,函数的执行,定义整型和字符型函数,不需要指定函数类型,系统会自动调成int类型 怎么定义函数? 数据类型 函数名(参数) {} 函数的嵌套,函数的递归。 函数啊函数。 强化学习是...
  • Ps:今天看stl源码时看到__cdecl,不明白,就找了下面的一些资料cdecl、pascal、stdcall、fastcall等修饰符号到底什么意思呢?非常简单,就是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是压入堆栈的内容由谁来...
  • cdecl、pascal、stdcall、fastcall等修饰符号到底什么意思呢?非常简单,就是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是压入堆栈的内容由谁来清除,调用者还是函数自己?这些开关用来告诉编译器产生什么样...
  • 关于回溯与栈的最初的迷茫之处:刚开始听完迷宫问题求通路的时候,我就...《希望你们能看懂我说的什么意思,嘿嘿》,如果就这么用文字描述答案虽然能说通但是印象并不会太深刻,所以不说废话了。直接上代码。//Stack.h
  • 后来才好像明白是什么意思… 假设有一串数字要将他们压栈: 1 2 3 4 5 如果这个栈是很大很大,那么一次性全部压进去,再出栈:5 4 3 2 1 但是,如果这个栈高度为4,会发生什么? 1 2 3 4都顺利入栈,但是满了,那么...
  • 我们看下面这个迷宫----方阵(也可以是矩阵)...回溯是什么意思呢???先从起点出发,检查它的上下左右是否是通路(即是否有为数字0处)。也就是说为0通了,压栈,将此位置元素变成2,这样做的好处是明确通路路径。...
  • fork 是 分叉的意思 , 一个进程分成两个进程 之前实现了一个 多进程os,也必定实现了fork https://github.com/lisider/learn_os/tree/master/process 看一下 fork 一个进程 XXX 的本质是什么 1. 为 TCB 找一块空间 ...
  • 二叉树的遍历是以DFS和BFS为基础的,无非是在DFS和BFS上面的变形,熟练掌握了BFS和DFS以后,这种类型的题目也就没有什么太大的难度了 题目描述如下: 题目大致意思: 根据二叉树的中序遍历序列,给出树的后续遍历...

空空如也

空空如也

1 2
收藏数 34
精华内容 13
关键字:

压栈什么意思