数据结构之堆、栈、队列

1、堆

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

 (1)堆类似于一棵树。每个节点都有一个值。

 (2)并且满足下面两个性质。

             第一:堆中某个节点的值总是不大于或不小于其父节点的值;
             第二:堆总是一棵完全二叉树。

 (3)堆的存取是随意的。(例如:图书馆的书架上取书)

 (4)堆分为两种:第一种:最大堆。第二种:最小堆(父结点中的元素一定比子结点的元素要小

 

 2、栈

定义:栈是限定仅在表头进行插入和删除操作的线性表。

【之前看过一个笑话这里分享下:面试官:你能不能用一句话,给一个外行人解释一下,栈和队列的区别是啥?面试者:栈就是吃多了吐,队列就是吃多了拉。他说的对,我竟无言以对。】

这就类似于我们要在取放在箱子底部的东西(放进去比较早的物体),我们首先要移开压在它上面的物体(放进去比较晚的物体)。

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

 

(2)多栈共享邻接空间  :

如果我们有两个相同类型的栈,我们为他们各自开辟了数组空间,极有可能第一个栈已经满了,再进栈就溢出了,而另一个栈还有很多存储空间空闲。这时,我们完全可以用一个数组两存储两个栈。

      我们的做法如下图,数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处,另一个栈为数组的末端,即下标为数组长度n-1处。这样,两个栈如果增加元素,就是两端点向中间延伸。

 

3、队列

定义:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

【用一个比较直观的例子:行李过安检的时候,先放进去的行李在另一端总是先出来,后放入的行李会在最后面出来。】

(1)我们把队列的这种头尾相接的顺序存储结构称为【循环队列】

(2)顺序队列中的溢出现象:

(1) "下溢"现象:当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件。

(2)"真上溢"现象:当队列满时,做进栈运算产生空间溢出的现象。“真上溢”是一种出错状态,应设法避免。

(3)"假上溢"现象:由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为"假上溢"现象。

克服假溢出的方法有两种。

      一种:  将队列中的所有元素均向低地址区移动,显然这种方法是很浪费时间的;

    另一种:方法是将数组存储区看成是一个首尾相接的环形区域。当存放到n地址后,下一个地址就"翻转"为1。在结构上采用这种技巧来存储的队列称为循环队列

 

参考:(1)数据结构与算法(王曙燕)教材

(2)https://baike.baidu.com/item/%E9%98%9F%E5%88%97/14580481?fr=aladdin

(3)https://www.jianshu.com/p/5f148c3e4f7d

(4)https://www.cnblogs.com/heyonggang/p/3368379.html

(5)https://baike.baidu.com/item/%E6%A0%88/12808149?fr=aladdin

欢迎指出错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值