关于堆栈解释 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容 #Wrapper { background-color: #e2e2e2; background-image: url("/static/img/shadow_light.png"), url("//cdn.v2ex.com/assets/bgs/circuit.png"); background-repeat: repeat-x, repeat-x; } #Wrapper.Night { background-color: #1f2e3d; background-image: url("/static/img/shadow.png"), url("//cdn.v2ex.com/assets/bgs/circuit_night.png"); background-repeat: repeat-x, repeat-x; background-size: 20px 20px, 162.5px 162.5px; }
83f420984
V2EX    程序员

关于堆栈解释

  •  
  •   83f420984 2014-07-04 10:46:14 +08:00 7894 次点击
    这是一个创建于 4124 天前的主题,其中的信息可能已经有所发展或是发生改变。
    百度百科解释堆栈:堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆,列队优先,先进后出;栈,后进先出

    可能我理解的不对,不对的地方请指点,后面的要点开始,堆:先进后出;栈:后进先出,既然堆是先进后出,而又说栈是后进先出,那如何实现先进后出后进先出?有没有岐义?
    47 条回复    2014-07-04 20:49:55 +08:00
    hellov22ex
        1
    hellov22ex  
       2014-07-04 10:52:34 +08:00   1
    身为一个程序员,在寻找专业知识的时候,请不要去看百度百科,谢谢

    堆是先进先出,栈是先进后出

    楼下的,我说的对不对?
    hyq
        2
    hyq  
       2014-07-04 10:56:07 +08:00   1
    @hellov22ex 必须对
    hyq
        3
    hyq  
       2014-07-04 10:57:26 +08:00
    @hellov22ex 好吧,我也错了,谁说堆是先进先出,尼玛那是队列啊!!!被你和楼主给误导了
    maikcn
        4
    maikcn  
       2014-07-04 10:59:09 +08:00   1
    堆不就是栈?

    堆栈 - Stack - LIFO(后进先出)
    队列 - Queue - FIFO(先进先出)
    hyq
        5
    hyq  
       2014-07-04 11:00:26 +08:00
    在计算机科学中,堆可以指:

    一种树形数据结构,详见堆 (数据结构) http://zh.wikipedia.org/wiki/%E5%A0%86_(%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84)
    用于动态内存分配的内存空间

    维基上抄下来的
    wy315700
        6
    wy315700  
       2014-07-04 11:04:24 +08:00   1

    分为最大堆和最小堆
    最大堆的意思是,每次取出的都是最大的一个数
    最小堆意思类推


    先进后出

    队列
    先进先出

    优先级队列
    按照某个优先级出。

    大部分系统里,堆是作为优先级队列的一个实现方法。
    maikcn
        7
    maikcn  
       2014-07-04 11:06:24 +08:00
    好吧,原来堆是heap,被中文搞糊涂了 = =
    Mutoo
        8
    Mutoo  
       2014-07-04 11:08:09 +08:00   1
    堆栈(英语:stack),也可直接称栈。
    http://zh.wikipedia.org/wiki/%E5%A0%86%E6%A0%88

    你说的是队列(FIFO)/栈(FILO)的区别

    另外在编译原理中,堆(heap)和栈(stack)有另外的解释

    此外还有一个叫堆排序(大根堆、小根堆)的算法
    johncang
        9
    johncang  
       2014-07-04 11:09:40 +08:00
    我一直以为 V2EX 都是问些高大上的问题,原来还可以问这种问题
    heliar
        10
    heliar  
       2014-07-04 11:17:07 +08:00
    ...其实是stack不是heap。。heap是另外个东西。。不知道为啥要翻译成堆栈。。是要和储存另一个栈的概念做区分么
    lu18887
        11
    lu18887  
       2014-07-04 11:17:17 +08:00   1
    @hellov22ex “堆栈”就是 stack 吧,不要分开理解!
    单独的"堆"和 heap 对应

    不要误导了别人噢!
    heliar
        12
    heliar  
       2014-07-04 11:18:45 +08:00
    @heliar 额。。多打了两个字。。‘储存’
    lu18887
        13
    lu18887  
       2014-07-04 11:18:51 +08:00
    这个问题,建议把一二楼踩下去,太容易误导小白了!
    touzi
        14
    touzi  
    PRO
       2014-07-04 11:20:04 +08:00
    记得大一上课的时候老师画了个图,非常形象的理解了堆栈的区别.现在找大一笔记已经不见了.
    em70
        15
    em70  
       2014-07-04 11:21:35 +08:00   1
    见过装羽毛球的球筒吧,一个原理
    yakczh
        16
    yakczh  
       2014-07-04 11:22:36 +08:00   1
    做为一名程序员 在host中屏蔽百度才会有技术进步

    找到hosts文件
    win32 "C:\Windows\System32\drivers\etc\hosts"
    linux /etc/hosts

    最前面写上一句 127.0.0.1 www.baidu.com
    tabris17
        17
    tabris17  
       2014-07-04 11:25:24 +08:00   1
    还是说英文吧, 栈是stack,堆是heap

    stack一般指FILO访问内存

    heap在不同语境下意义不同
    ffffwh
        18
    ffffwh  
       2014-07-04 11:30:41 +08:00   1
    初级阶段,堆请理解为能够动态被分配的内存。
    它确实是用“堆”来实现的,不过你只要关心malloc/free就行...
    mikale
        19
    mikale  
       2014-07-04 11:32:21 +08:00
    也把stack翻堆。。不知道是怎回事
    xinglp
        20
    xinglp  
       2014-07-04 11:32:54 +08:00
    @maikcn 堆是堆栈是栈
    abscon
        21
    abscon  
       2014-07-04 11:46:13 +08:00   1
    很简单的事情:

    堆栈 == 栈
    堆 != 栈
    hellov22ex
        22
    hellov22ex  
       2014-07-04 11:50:45 +08:00
    @lu18887 感谢
    @hyq 我也不知道我被什么误导了,,,
    soundbbg
        23
    soundbbg  
       2014-07-04 11:56:53 +08:00
    .... stack queue heap ....
    wy315700
        24
    wy315700  
       2014-07-04 11:59:29 +08:00
    @hellov22ex 教材没选好吧
    hooluupog
        25
    hooluupog  
       2014-07-04 12:07:52 +08:00
    后面的要点开始,堆:先进后出;
    =====================================
    如果你说的是数据结构中的堆的话,这种说法肯定是错的。
    xylophone21
        26
    xylophone21  
       2014-07-04 12:22:00 +08:00
    只能说"堆栈"这个翻译太糟糕了. BTW,好像没有正式一点的文档用"堆栈"这个词吧?
    keyanzhang
        27
    keyanzhang  
       2014-07-04 12:25:13 +08:00 via iPhone   1
    Stack 的意思呢就是你吃完西吐了,最後吃的那被最先吐出;Queue 的意思就是你拉肚子了……
    semicircle21
        28
    semicircle21  
       2014-07-04 12:29:07 +08:00
    @keyanzhang
    那Heap呢? 画面太美, 不敢想象啊..
    hellov22ex
        29
    hellov22ex  
       2014-07-04 12:29:36 +08:00
    @wy315700 不清楚在哪里得到的这个错误的知识。。
    railgun
        30
    railgun  
       2014-07-04 12:31:34 +08:00
    堆和栈是不同的东西……
    canautumn
        31
    canautumn  
       2014-07-04 12:34:56 +08:00
    堆栈(英语:stack),也可直接称栈。中国大陆作堆栈,台湾作堆叠 wikipedia
    lu18887
        32
    lu18887  
       2014-07-04 12:41:13 +08:00
    @yakczh 太能黑了!哈哈
    loryyang
        33
    loryyang  
       2014-07-04 13:20:40 +08:00   1
    中文这几个词比较复杂,称呼的不同,可以直接用stack和heap来表示,stack就是先进后出,heap不讲先后的,他是按照规律排序的,每次把排在最前面的哥们踢掉。另外程序语言会使用堆栈来表示内存分配的空间,比如Java内存分配中,堆和栈是不一样的分配方式
    tsingyi
        34
    tsingyi  
       2014-07-04 13:30:52 +08:00
    这里的堆栈是指的程序运行的内存空间,一个栈内存,一个堆内存。和数据结构所说的栈的堆有不同的含义。
    http://www.ruanyifeng.com/blog/2013/11/stack.html
    se77en
        35
    se77en  
       2014-07-04 13:42:55 +08:00   3
    楼上的各位:shut the fuck up
    一图胜千言:


    外加文字说明:


    这是存储器用来保存局部变量的部分。每当调用函数,函数的所有局部变量都在栈上创建。它之所以叫栈是因为它看起来就像堆积而成的栈板:当进入函数时,变量会放到栈顶;离开函数时,把变量从栈顶拿走。奇怪的是,栈做起事来颠三倒四,它从存储器的顶部开始,向下增长。



    我们还没有用过这部分的存储器,堆用于动态存储:程序在运行时创建一些数据,然后使用很长一段时间,稍后会看到堆的用法。

    全局量

    全局量位于所有函数之外,并对所有函数可见。程序一开始运行时就会创建全局量,你可以修改它们。

    常量

    常量也在程序一开始运行时创建,但它们保存在只读存储器中。常量是一些在程序中要用到的不变量,你不会想修改它们的值,例如字符串字面值。

    代码

    最后是代码段,很多操作系统都把代码放在存储器地址的低位。代码段也是只读的,它是存储器中用来加载机器代码的部分。
    se77en
        36
    se77en  
       2014-07-04 13:44:26 +08:00
    @se77en 摘自 《Head First C》
    xiaowangge
        37
    xiaowangge  
       2014-07-04 13:58:51 +08:00   1
    阮一峰:《Stack的三种含义》

    http://www.ruanyifeng.com/blog/2013/11/stack.html
    lu18887
        38
    lu18887  
       2014-07-04 14:21:55 +08:00
    @se77en you are talking about memory layout , the poster is talking about data structures.
    se77en
        39
    se77en  
       2014-07-04 14:42:08 +08:00
    @lu18887 数据结构来说的话,堆栈就是栈
    shoumu
        40
    shoumu  
       2014-07-04 14:46:48 +08:00   1
    这在混淆概念啊
    数据结构里面里的堆栈和程序运行时使用的堆栈就不是一个概念。楼主你到底问哪个?
    S1ahs3r
        41
    S1ahs3r  
       2014-07-04 14:59:57 +08:00
    内存中堆栈跟数据结构堆栈不太一样的,这个就算百度也能百度出结果
    83f420984
        42
    83f420984  
    OP
       2014-07-04 15:36:30 +08:00
    @shoumu 我起初是在《Javascript高级程序设计》里面看到'方法',然后搜索这个叫做'方法',就找到了百度百科的解释,所以才有了我的问题。
    dadou
        43
    dadou  
       2014-07-04 16:57:00 +08:00
    中文里,堆是堆,栈是栈,堆栈是栈。
    yuankui
        44
    yuankui  
       2014-07-04 18:02:36 +08:00   1
    请不要把堆栈中的堆和栈分开好伐?

    堆栈=stack
    你说的先进先出应该是队列queue
    堆是一种内存管理方式,没有先进先出,先进后出这一说,而且支持随机读写的。
    krafttuc
        45
    krafttuc  
       2014-07-04 18:08:23 +08:00
    「堆栈」这个词竟然这么流行!我觉得堆是堆,栈是栈。两个字放一起就有一股弄弄的乡土气息。即使楼上解释说「堆栈」指「栈」,还是无法接受啊。。。摔!
    aisk
        46
    aisk  
       2014-07-04 18:18:29 +08:00
    我去……我还以点错进了博客园
    yukirock
        47
    yukirock  
       2014-07-04 20:49:55 +08:00   2
    拓,堆是二叉,其中子的值小於母(大堆),或反之(小堆)。插入及取出值涉及堆旋操作,目的是足堆的性。也可以直接用下模 2 表示堆的位置,Heapsort 就是做的。

    中文基把 Heap 引到 Priority Queue 是的。有用 Heap PQ 的,但就概念而言,二者不等同。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2544 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 118ms UTC 02:29 PVG 10:29 LAX 19:29 JFK 22:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86