堆栈 订阅
在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。 展开全文
在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。
信息
外文名
Stack
定    义
一种数据项按序排列的数据结构
特    点
先进后出
中文名
堆栈
学    科
计算机
应    用
内存分配
堆栈简介
堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的 [1]  。对这个存储区存入的数据,是一种特殊的数据结构。所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。在内存储器(随机存储器)中开辟一个区域作为堆栈,叫软件堆栈;用寄存器构成的堆栈,叫硬件堆栈。单片机应用中,堆栈是个特殊存储区,堆栈属于RAM空间的一部分,堆栈用于函数调用、中断切换时保存和恢复现场数据。堆栈中的物体具有一个特性:第一个放入堆栈中的物体总是被最后拿出来, 这个特性通常称为先进后出 (FILO—First-In/Last-Out)。 堆栈中定义了一些操作, 两个最重要的是PUSH和POP。 PUSH(入栈)操作:堆栈指针(SP)加1,然后在堆栈的顶部加入一 个元素。POP(出栈)操作相反,出栈则先将SP所指示的内部ram单元中内容送入直接地址寻址的单元中(目的位置),然后再将堆栈指针(SP)减1。这两种操作实现了数据项的插入和删除。
收起全文
精华内容
下载资源
问答
  • 堆栈

    千次阅读 2020-01-21 21:58:54
    堆栈的抽象数据类型描述 类型名称:堆栈(stack) 数据对象集: 一个有0个元素的又穷线性表。 操作集: 长度为MaxSize的堆栈S属于Stack, 堆栈元素item 属于 ElementType 1、Stack CreateStack(int MaxSize): ...

    堆栈的抽象数据类型描述

    类型名称:堆栈(stack)

    数据对象集: 一个有0个元素的又穷线性表。

    操作集: 长度为MaxSize的堆栈S属于Stack, 堆栈元素item 属于
    ElementType

    1、Stack CreateStack(int MaxSize): 生成空堆栈, 其最大长度为MaxSize;

    2、int IsFull (Stack S, int MaxSize): 判断堆栈S是否已满;

    3、void Push(Stack S, ElementType item): 将元素item压入堆栈;

    ***4、ElementType Pop(Stack S): 删除并返回栈顶元素;

    在这里插入图片描述

    展开全文
  • JavaScript执行堆栈

    万次阅读 2019-05-10 08:01:59
    我们首先看JavaScript的函数底层工作原理 一个函数运行的信息被存储在它的执行上下文里。...与它关联的执行上下文被一个叫做执行上下文堆栈的特殊数据结构保存; 执行嵌套调用; 嵌套调用结束后...

    我们首先看JavaScript的函数底层工作原理
    一个函数运行的信息被存储在它的执行上下文里。
    执行上下文是一个内部数据结构,它包含一个函数执行时的细节:当前工作流在哪里,当前的变量,this的值(这里我们不使用它),以及其他一些内部细节。
    每个函数有嵌套调用时,下面的事情会发生:

    • 当前函数被暂停;
    • 与它关联的执行上下文被一个叫做执行上下文堆栈的特殊数据结构保存;
    • 执行嵌套调用;
    • 嵌套调用结束后,之前的执行上下文从堆栈中恢复,外部函数从停止的地方继续执行。
      我们看看调用pow(2, 3)都发生了什么。
      pow(2, 3)
      在调用pow(2, 3)的开始,执行上下文会存储变量:x = 2, n = 3,执行流程在函数的第1行。
      我们将其描绘如下:
      在这里插入图片描述
      这是函数开始执行的时候,条件 n == 1结果为否,所以流程进入if的第二分支。
    function pow(x, n) {
    	if (n == 1) {
    		return x;
    	} else {
    		return x * pow(x, n - 1);
    	}
    }
    alert(pow(2, 3));
    

    变量相同,但是函数变化了,所以现在上下文是:
    在这里插入图片描述
    为了计算x * pow(x, n - 1),我们需要用新的参数pow(2, 2)自调用pow。
    pow(2, 2)
    为了执行嵌套调用,JavaScript会记住执行上下文堆栈中的当前执行上下文。
    这里我们调用相同的函数pow,但是没关系。所有函数的处理都是一样的:
    1.当前上下文被「记录」在堆栈的顶部;
    2.为子调用创建新上下文;
    3.当子调用结束后 —— 前一上下文从堆栈弹出,继续执行。
    下面是进入子调用pow(2, 2)的上下文堆栈:
    在这里插入图片描述
    新的当前执行上下文位于顶部(加粗),前面的在下方。
    在我们完成子调用后—— 很容恢复前面的上下文,因为它保留这变量和代码停止时的准确位置。图中我们使用了单词「行」,但实际比这更精确。
    pow(2, 1)
    重复该过程:在第5行生成新的子调用,现在使用参数x = 2, n = 1。
    新的执行上下文被创建,前一个被压入堆栈顶部:
    在这里插入图片描述
    此时,有俩个旧的上下文和一个当前正在运行的给pow(2, 1)的上下文。
    出口
    在 pow(2, 1) 时,不像之前,条件 n == 1 成了是,所以 if 的第一分支生效:

    function pow(x, n) {
    	if (n == 1) {
    		return x;
    	} else {
    		return x * pow(x, n - 1);
    	}
    }
    

    此时不再有嵌套调用,所以函数结束,返回2。
    函数结束后,它的执行上下文不再有用,会在内存中移除。前一上下文从栈顶恢复:
    在这里插入图片描述
    恢复执行pow(2, 2),它有子调用pow(2, 1)的结果,所以它也可以结束x * pow(x, n - 1) 的执行,返回 4。
    然后前一上下文被恢复:
    在这里插入图片描述
    当它结束后,我们得到结果pow(2, 3) = 8。
    递归深度是:3。
    从上面的图解可以看到,递归深度等于堆栈中上下文的最大个数。
    注意内存要求。上下文消耗内存,在我们的例子中,求n次放需要存储n个上下文,以便减一后的n使用。
    而循环算法更省内存:

    function pow(x, n) {
    	let result = 1;
    	for (let i = 0; i < n; i++) {
    		result *= x;
    	}
    	return result;
    }
    

    迭代pow仅使用一个上下文,在处理中修改i和result。它的内存要求比较小,且固定不依赖n。
    任何递归都可以用循环来重写。循环变体一般更加有效。
    但有时重写很难,尤其是函数根据条件使用不同的子调用,然后合并它们的结果,或者分支比较复杂。而且有些优化可能没有必要,完全不值得。
    递归能提供更简洁的代码,容易理解和维护。优化并不是处处需要,大多数时候我们需要一个好代码,这就是它被使用的原因。

    展开全文
  • 堆栈堆栈大小

    2016-03-17 21:01:00
    正在执行的程序为执行该程序的初始(或主)线程维护一个主堆栈,并为每个从属线程维护不同的堆栈堆栈是临时内存地址空间,用于保留子程序或函数引用调用期间的参数和自动变量。如果线程堆栈的大小太小,则可能会...

     

    正在执行的程序为执行该程序的初始(或主)线程维护一个主堆栈,并为每个从属线程维护不同的堆栈。堆栈是临时内存地址空间,用于保留子程序或函数引用调用期间的参数和自动变量。如果线程堆栈的大小太小,则可能会出现堆栈溢出,从而导致无提示数据损坏或段故障。

    使用 f95 -stackvar 选项编译 Fortran 程序会强制在堆栈中分配局部变量和数组,就好像它们是自动变量。显式并行化的程序暗指对 OpenMP 程序使用 -stackvar,因为该选项可提高优化器将循环中的调用并行化的能力。(有关 -stackvar 标志的讨论,请参见 Fortran 用户指南。)但是,如果为堆栈分配的内存不足,该使用会导致堆栈溢出。

    使用 limit C-shell 命令或者 ulimit Bourne 或 Korn shell 命令可显示或设置初始线程(或主线程)的堆栈大小。一般而言,初始线程的缺省堆栈大小为 8 MB。

    OpenMP 程序的每个从属线程均具有其自身的线程堆栈。此堆栈模拟初始(或主)线程堆栈,但对于线程是唯一的。线程的 PRIVATE 数组和变量(对于线程是局部的)在线程堆栈中分配。在 32 位 SPARC V8 和 x86 平台上,缺省大小为 4 MB;在 64 位 SPARC V9 和 x86 平台上,缺省大小为 8 MB。从属线程堆栈的大小通过 OMP_STACKSIZE 环境变量来设置。

    转载于:https://www.cnblogs.com/caozengling/p/5289312.html

    展开全文
  • 堆栈寻址

    2020-04-03 12:49:05
    堆栈寻址 堆栈寻址:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。 堆栈是寄存器(或专用寄存器组)中一块特定的按"后进先出(LIFO)" 原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器...

    堆栈寻址

    堆栈寻址:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。
    堆栈是寄存器(或专用寄存器组)中一块特定的按"后进先出(LIFO)"
    原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)
    在这里插入图片描述

    硬堆栈和软堆栈

    在这里插入图片描述

    展开全文
  • 堆栈溢出

    千次阅读 2019-03-26 22:10:13
    堆栈:是一个在计算机科学中经常使用的抽象数据类型,堆栈是一块保存数据的连续内存。 一个名为堆栈指针(SP)的寄存器指向堆栈的顶部,堆栈的底部在一个固定的地址。 堆栈中的物体具有一个特性: 最后一个放入堆栈中的...
  • 堆栈的C语言实现

    千次阅读 2017-10-18 13:26:35
    堆栈
  • 51单片机 堆栈堆栈指针

    千次阅读 2018-10-04 14:36:29
    堆栈是一种执行“先入后出”算法的数据结构。是在内存中的一个存储区域,数据一个一个顺序地存入(也就是“压入—PUSH”)这个区域之中。  有一个地址指针(堆栈指针)总指向最后一个压入堆栈的数据所在的存储单元...
  • 关于堆栈

    千次阅读 2019-09-05 17:15:07
    写这篇博客的时候,我总会想到之前面试被怼的经历。 面试官最后总结出来一句话:你总是知其然不知其所以然!太浮于表面了 确实,了解一项知识之前首先应该明确: 1.它是什么?...堆栈到底是什么? ...
  • 调用堆栈

    2018-10-22 14:57:53
    一个调用堆栈 是一个解释的机制(如在Web浏览器中的JavaScript解释器)是来跟踪其位置的调用多种脚本功能, 以及目前正在运行,哪些功能是从函数中调用等。 当脚本调用函数时,解释器将其添加到调用堆栈,然后开始...
  • 堆栈

    2019-10-01 13:26:34
    滴水逆向三期—堆栈图 什么叫逆向? 比如说有一块内存,内存里面存储的就是数据,那我们所谓的逆向就是来分析这个数据到底是什么 堆栈图: 比如给个地址0x401168 打开DTDebug: ctrl+g 将地址打上后 ok: 看到定位...
  • 堆栈总结

    2018-02-24 10:07:36
    堆栈 什么是堆栈 堆栈的抽象数据类型描述 栈的顺序存储实现 堆栈 什么是堆栈 计算机如何进行表达式求值? 算术表达式5+6/2-3*4。 正确理解: 5+6/2-3*4 = 5+3-3*4 = 8-3*4 = 8-12 = -4 由两类...
  • 根据汇编指令画堆栈

    万次阅读 2020-06-04 19:14:06
    3. 记录此时的堆栈位置,开始画堆栈图。 4. 参数入栈,再次记录栈顶位置。 5. 函数调用处地址压栈,栈顶 + 4。地址为此行指令执行结束后的地址,通过指令宽度(当前地址加当前指令长度:此处为5字节)计算出来。 6....
  • 任务堆栈

    2017-03-07 08:44:14
    每个任务都有自己的堆栈空间。堆栈必须声明为OS_STK类型,并且由连续的内存空间组成。用户可以静态分配堆栈空间(在编译的时候分配)也可以动态地分配堆栈空间(在运行的时候分配)。静态堆栈声明如程序清单 L4.4和4.5所...
  • 深入理解任务堆栈以及堆栈溢出

    千次阅读 2019-05-26 23:56:18
    在多任务操作系统中创建任务时,都需要指定该任务的堆栈大小,那么这个堆栈的作用时什么呢?什么情况下需要用到堆栈,以及大小不够时会产生什么异常呢? 1 任务状态 简单分为运行态,就绪态,阻塞态。 运行态:...
  • 堆栈游戏题解

    千次阅读 2020-10-05 16:02:37
    开始他有一个空的堆栈,编号为0.在第i步(1<=i<=300000),他会选择一个编号为v的堆栈,复制一份并做如下操作: a v 表示将v号堆栈复制一份,新栈的编号为i,并将元素i压入新栈的栈顶。 b v 表示将v号堆栈复制一...
  • 顺序堆栈

    2017-03-20 16:02:26
    堆栈示意图 堆栈进出原则 先进后出 数据集合 堆栈的数据集合的元素可以表示为任意的类类型。 操作集合 (1)入栈push(obj):把数据元素obj插入堆栈; (2)出栈pop():出栈,删除的数据元素由函数返回; (3)取栈顶...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,431
精华内容 29,372
关键字:

堆栈