• 数据结构中的堆栈和操作系统中的堆栈


    在面试的时候我们经常被问到堆和栈相关的问题,悲催的是还傻傻分不清面试官要问的是哪个堆栈。

    是的,堆和栈有两层含义,分别对应如下两个方面:

    数据结构中的堆和栈、以及队列

    1. 堆

    官方定义如下:n个元素的序列{k1, k2, … kn},当且仅当满足以下关系时称之为堆:

    堆其实就是利用完全二叉树的结构来维护的一维数组

    如果所有的子节点都小于其父节点,这样的堆称为大顶堆;相反称为小顶堆

    堆数据结构的介绍就这么些了,那它有啥用呢?我们发现如果一直取根节点,得到的序列就是一个有序序列,感觉这样的数据结构天生就是为排序准备的呀。

    2. 栈

    栈是一种先进后出的数据结构,官方定义为:限定仅在表尾进行插入或删除操作的线性表,表尾称为栈顶,表头为栈底。

    说白了,栈在数据结构里边可以看成是一端封死了的容器。就像米缸一样的,先倒进去的米最后才能倒出来。

    别看这么简单的一个数据结构,其用途可不可小觑,从普通代码开发到编译器再到内核都有其身影,最常见如编译器中的括号匹配,内核中的程序现场保存等。、

    3. 队列

    队列跟栈有点类似,只是它是一个先进先出的数据结构。只运行在表的一端插入,另一端删除,插入的一方叫队尾,删除的一方叫队头。

    好吧,也是个简单的数据结构,简单到都不好意思介绍下去了,用途的话也是大大的广,比如缓存设计,消息队列等等。
     

    操作系统中的堆栈

    在操作系统中的堆栈是一个特殊的存储区,栈一般是由操作系统控制分配回收,用在如局部变量,函数调用存储等地方,其大小是固定的(比如有些系统为2M),所以如果要求分配的空间大于了栈的大小,将出现栈溢出。

    堆是由用户(码农)控制分配和回收,此处的控制是指显式调用一个系统函数,如malloc,free等,从系统中分配一个所需大小的空间出来。其在系统中的存储方式依据系统的不同而不同,在Linux系统中,堆可以理解成一个链表数组,该链表数组中存放的是内存空间地址,如下这样的设计:

    当需要分配时,系统将从对应大小的列表中摘一个下来分给用户,如果分配空间过多,会将多余的空间挂接到对应的列表下。

    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    Number Sequence ----HDOJ 1711
    B. Berland Bingo
    迷宫城堡--HDOJ 1269(Tarjan)
    迷宫城堡--HDOJ 1269
    前向星,链式前向星
    linux下建立无线wifi------简单实用!
    leetcode187- Repeated DNA Sequences- medium
    leetcode173- Binary Search Tree Iterator- medium
    leetcode170- Two Sum III
    leetcode167- Two Sum II
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/11841624.html
Copyright © 2020-2023  润新知