V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
83f420984
V2EX  ›  程序员

关于堆栈解释

  •  
  •   83f420984 · 2014-07-04 10:46:14 +08:00 · 7525 次点击
    这是一个创建于 3794 天前的主题,其中的信息可能已经有所发展或是发生改变。
    百度百科解释堆栈:堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(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  
       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   ·   实用小工具   ·   5138 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:17 · PVG 17:17 · LAX 01:17 · JFK 04:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.