什么是堆?什么是栈啊?

堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。

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

扩展资料:

一、堆的算法思想

不必将值一个个地插入堆中,通过交换形成堆。假设根的左、右子树都已是堆,并且根的元素名为R。这种情况下,有两种可能:

(1) R的值小于或等于其两个子女,此时堆已完成。

(2) R的值大于其某一个或全部两个子女的值,此时R应与两个子女中值较小的一个交换,结果得到一个堆,除非R仍然大于其新子女的一个或全部的两个。这种情况下,我们只需简单地继续这种将R“拉下来”的过程,直至到达某一个层使它小于它的子女,或者它成了叶结点。

二、栈的基本算法

1、进栈(PUSH)算法

①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②)。

②置TOP=TOP+1(栈指针加1,指向进栈地址)。

③S(TOP)=X,结束(X为新进栈的元素)。

2、退栈(POP)算法

①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②)。

②X=S(TOP),(退栈后的元素赋给X)。

③TOP=TOP-1,结束(栈指针减1,指向栈顶)。

参考资料来源:百度百科-堆

参考资料来源:百度百科-栈



什么是堆和栈?
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。

函数压栈是怎么回事?
函数压栈的本质是参数传递
这又跟汇编语言连系起来了.汇编语言的过程即proc可以理解成函数
比如一个最简单的计算两数之和函数
如果用汇编来写估计是这样的

sub proc
pop ax ;从stack取a 并放在AX寄存器中
pop bx ;从stack取b 并放在BX寄存器中
add ax,bx ; 计算a+b
ret //返回
sub endp

显然要调用这个函数,你应当先把b值push进stack,然后再push a
因为stack是先进后出的
所以调用汇编像这样
比如计算4+5
push 5;
push 4;
call sub; //返回值在AX中
在这个例子中先压5或先压4得到的结果没有变化
但大多数程序,如果参数的顺序错误将是灾难性的

因为不管什么高级语言最终都要编译成汇编语言,然后是机器语言
同样下面这个C程序,计算a+b值,必然会编译成上面的汇编代码
int sub(int a ,int b) {return a+b;}
所以C在调用这个函数sub时,必须要压栈(即传入参数)但这些工作,在C语言里,并不需要你来完成.你只要写出
sub(7,9);
编译器在编译成汇编时就会自动完成相关的压栈工作.

根据函数调用方式和参数压入顺序目前存在三种约定:

stdcall
cdecl
fastcall
这都相关压栈顺序和栈的清理工作约定
他们的细节都不相同,但有一点是肯定的,参数比须从右向左压入栈中
stdcall中 函数必须自已清理栈
cdecall 由调用者清除堆栈 C的默认函数调用方式 所以这样C支持可变参数
fastcall 是把函数参数列表的前三个参数放入寄存器eax,edx,ecx,其他参数压栈

源代码:
int function(int a, int b)
{
return a + b;
}

void main()
{
function(10, 20);
}

1.__cdecl

_function
push ebp
mov ebp, esp
mov eax, [ebp+8] ;参数1
add eax, [ebp+C] ;加上参数2
pop ebp
retn
_main
push ebp
mov ebp, esp
push 14h ;参数 2入栈
push 0Ah ;参数 1入栈
call _function ;调用函数
add esp, 8 ;修正栈
xor eax, eax
pop ebp
retn

2.__fastcall

@function@8
push ebp
mov ebp, esp ;保存栈指针
sub esp, 8 ;多了两个局部变量
mov [ebp-8], edx ;保存参数 2
mov [ebp-4], ecx ;保存参数 1
mov eax, [ebp-4] ;参数 1
add eax, [ebp-8] ;加上参数 2
mov esp, ebp ;修正栈
pop ebp
retn
_main
push ebp
mov ebp, esp
mov edx, 14h ;参数 2给EDX
mov ecx, 0Ah ;参数 1给ECX
call @function@8 ;调用函数
xor eax, eax
pop ebp
retn

3.__stdcall

_function@8
push ebp
mov ebp, esp
mov eax, [ebp] ;参数 1
add eax, [ebp+C] ;加上参数 2
pop ebp
retn 8 ;修复栈
_main
push ebp
mov ebp, esp
push 14h ;参数 2入栈
push 0Ah ;参数 1入栈
call _function@8 ;函数调用
xor eax, eax
pop ebp
retn

堆栈解析大全

抽象篇:

内存的地址从0开始到最大
堆就是内存地址从最大向0的方向递减
栈就是内存地址从0向最大的方向递增

通俗篇:

栈是指只能从一边存入和取出数据
队是指一边存入另一边取出

实战篇:

堆(heap)是系统中可供程序自由动态分配的内存空间,c中用malloc来从堆中取得一块内存,用free释放。
栈(stack)是一种数据结构,先进先出。可以在程序中自己建立,还有函数栈,是系统调用函数时临时分配的内存空间,用来保留一些必要的数据,函数运行后释放。

理论篇:

堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆:顺序随意,先进后出可以,先出后行也行。栈:后进先出(Last-In/First-Out)

缩水篇:

new操作的内存在堆空间;而int a;类似的变量的内存在栈空间。

推荐篇:

http://www.diybl.com/course/3_program/c++/cppsl/20081117/151367.html

堆(heap)是系统中可供程序自由动态分配的内存空间,c中用malloc来从堆中取得一块内存,用free释放。

栈(stack)是一种数据结构,先进先出。可以在程序中自己建立,还有函数栈,是系统调用函数时临时分配的内存空间,用来保留一些必要的数据,函数运行后释放。

堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆:顺序随意,先进后出可以,先出后行也行。栈:后进先出(Last-In/First-Out)

C语言中的栈、堆是什么?

C语言中的堆和栈都是一种数据项按序排列的数据结构。
栈就像装数据的桶或箱子
我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。
这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。
堆像一棵倒过来的树
而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。
通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书。
虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。

扩展资料:
关于堆和栈区别的比喻
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
参考资料来源:百度百科-堆栈

将堆跟栈放在一起将是因为两者都是存储数据的方式。区别如下:
一、主体不同
1、堆:是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。
2、栈:又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。


二、特点不同
1、堆:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。
2、栈:是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶。
三、作用不同
1、堆:堆是非线性数据结构,相当于一维数组,有两个直接后继。
2、栈:可以用来在函数调用的时候存储断点,做递归时要用到栈。

参考资料来源:百度百科-堆
参考资料来源:百度百科-栈


啥叫堆?啥叫栈
堆(数据结构):堆可以被看成是一棵树,如:堆排序;栈(数据结构):一种先进后出的数据结构。

C语言中的栈和堆是什么?
1、计算机中的内存分为两部分:一部分是栈(stack,也称堆栈),另一部分是堆(heap)。2、 栈,可以看作是一摞卡片,最上面的卡片表示程序的当前作用域,这往往就是当前正在执行的函数。3、堆,一段完全独立于当前函数或者栈帧的内存区。如果一个函数中声明了一些变量,而且希望当这个函数完成时其中...

什么是堆?什么是栈啊?
堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把...

为什么要把堆和栈区分?
1.堆的概念:堆是内存中一部分不连续的区域,由程序员手动分配和释放内存,称为动态内存分配。在堆中分配内存使用的是malloc和free等函数。堆的实现方法:堆的实现方法是由操作系统提供的,操作系统会分配一块内存空间,多个程序共用这块空间,每个进程或线程再在这块空间上动态划分出自己需要的内存。日常...

什么是堆栈
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(...

堆(heap)和栈(Stack)的区别是什么?为什么平时都把堆栈放在一起讲?
1、堆:是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。2、栈:又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。二、特点不同 1、堆:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。2、栈...

请简单通俗易懂的解释一下在Java中什么叫堆 什么叫栈 谢谢
在java中的栈:栈的原理明白了,其实只要是计算机只要是编程语言,什么堆什么栈都是一样的,基本作用也一样。java中可以认为,栈用来存放局部变量的。public void fun(){ int i=0; \/\/i 是一个局部变量,存放在栈里面的 Object obj = new Objec(); \/\/obj 是一个对象应用,同样也是一个局部变量...

什么是栈?什么是堆?
栈(stack)是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈,程序员不能直接地设置栈。堆栈是一种执行“后进先出”算法的数据结构 栈的特点是先进后出,队列的特点是先进先出.栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定...

什么是堆和栈啊?
那么:堆是指由操作系统管理分配、由应用程序请求的内存,具有运行时分配(动态分配)的特点。栈是操作系统维护的上面说的“栈”,不过是特指,通常每个线程分配一个,函数调用时用到的参数和返回地址通常存放在上面(当然也有不这样做的语言,比如老Fortran),也用来存放函数局部变量。也是动态分配。

堆和栈有什么区别
堆是一种经过排序的树形数据结构,每个结点都有一个值,堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意。栈是后进先出性质的数据结构。此外,栈:在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数...