若是你学过数据结构,就必定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些究竟是什么意思?最关键的是即便你去面试,这些都还会问到,因此若是你不懂对你是损失很大的。前端
堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。程序员
要点:堆:顺序随意 栈:后进先出(Last-In/First-Out)面试
堆:什么是堆?又该怎么理解呢?算法
①堆一般是一个能够被看作一棵树的数组对象。堆老是知足下列性质:后端
·堆中某个节点的值老是不大于或不小于其父节点的值;数组
·堆老是一棵彻底二叉树。缓存
将根节点最大的堆叫作最大堆或大根堆,根节点最小的堆叫作最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。数据结构
②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对通常内存的访问没有区别。多线程
③堆是应用程序在运行的时候请求操做系统分配给本身内存,通常是申请/给予的过程。函数
④堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。
栈:什么是栈?又该怎么理解呢?
①栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅容许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另外一端称为栈底。
②栈就是一个桶,后放进去的先拿出来,它下面原本有的东西要等它出来以后才能出来(先进后出)
③栈(Stack)是操做系统在创建某个进程时或者线程(在支持多线程的操做系统中是线程)为这个线程创建的存储区域,该区域具备FIFO的特性,在编译的时候能够指定须要的Stack的大小。
堆栈:什么是堆栈?又该怎么理解呢?
注意:其实堆栈自己就是栈,只是换了个抽象的名字。
堆栈的特性: 最后一个放入堆栈中的物体老是被最早拿出来, 这个特性一般称为后进先出(LIFO)队列。 堆栈中定义了一些操做。 两个最重要的是PUSH和POP。 PUSH操做在堆栈的顶部加入一 个元素。POP操做相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。
堆、栈区别总结:
1.堆栈空间分配
①栈(操做系统):由操做系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操做方式相似于数据结构中的栈。
②堆(操做系统): 通常由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式却是相似于链表。
2.堆栈缓存方式
①栈使用的是一级缓存, 他们一般都是被调用时处于存储空间中,调用完毕当即释放。
②堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并非一旦成为孤儿对象就能被回收)。因此调用这些对象的速度要相对来得低一些。
3.堆栈数据结构区别
①堆(数据结构):堆能够被当作是一棵树,如:堆排序。
②栈(数据结构):一种先进后出的数据结构。
队列:什么是队列?又该怎么理解呢?
①队列是一种特殊的线性表,特殊之处在于它只容许在表的前端(front)进行删除操做,而在表的后端(rear)进行插入操做,和栈同样,队列是一种操做受限制的线性表。进行插入操做的端称为队尾,进行删除操做的端称为队头。
②队列中没有元素时,称为空队列。
③创建顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另外一个是队尾指针rear,它指向下一个入队元素的存储位置。
④队列采用的FIFO(first in first out),新元素(等待进入队列的元素)老是被插入到链表的尾部,而读取的时候老是从链表的头部开始读取。每次读取一个元素,释放一个元素。所谓的动态建立,动态释放。于是也不存在溢出等问题。因为链表由结构体间接而成,遍历也方便。(先进先出)
堆、栈、队列之间的区别是?
①堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对通常内存的访问没有区别。
②栈就是一个桶,后放进去的先拿出来,它下面原本有的东西要等它出来以后才能出来。(后进先出)
③队列只能在队头作删除操做,在队尾作插入操做.而栈只能在栈顶作插入和删除操做。(先进先出)