zoukankan      html  css  js  c++  java
  • 数据结构,小步前进之栈和队列

    什么是栈?

    在这里插入图片描述
    就像生活中我们叠书一样,一本本的叠,当叠到一定高度的时候,我们需要取书时,往往从最上层取,

    这就是 "后进先出"的数据结构,也成为栈。

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

    我们将最顶层的称为栈顶(Top),最底层为栈底(bottom),不含元素称为空栈。

    也可以很形象的称这种结构为后进先出(Last in First Out)LIFO结构。

    栈一般有插入和删除操作,插入我们称为入栈,压栈,删除称为出栈,弹栈。

    因为栈是线性表的特例,所以依据线性表的表现方式,栈亦有顺序存储结构和链表存储结构。

    栈的顺序存储结构

    一般使用数组作为存储数据的容器,然后定义Top指针指向顶层,标明第几索引为Top。

    优点:

    因为只允许栈顶进出,所以不存在移动位置问题,所以进出栈操作方便。

    缺点:

    因为使用数组,所以一开始就要定义栈的大小,不易扩展。

    栈的链式存储结构

    因为栈顶的top和链表的头结点重复,因此栈的链表不需要头结点

    优点:

    不需要提前分配好存储空间。

    缺点:

    因为增加指针域,所以增加了内存开销。

    总结

    如果使用过程元素变化不可预料,则使用链栈,在可控范围内,使用顺序栈。

    递归

    递归是栈的一个应用,诚如两面镜子对照。
    在这里插入图片描述
    在程序的应用中,一般是使用函数调用自身,即自己调用自己。

    为了避免递归陷入循环,我们记得要至少一个条件跳出递归。

    队列

    什么是队列?

    既然栈是后进先出,那有没有先进先出的,类似"排队"的逻辑结构?

    没错,就是队列,类似于就是现实生活的排队。

    队列是只允许在一端进行插入操作,另一端进行删除操作的线性表。

    允许插入的称为队尾,允许删除的为队头。

    顺序存储结构的队列

    如果使用顺序存储结构即数组实现队列,会有一个问题,每一次删除队头,后续的位置都要进行移动。

    在这里插入图片描述
    现实是如此,排队买票,前面买完往后撤,后面的人全部往前移动。

    但是想想,为什么一定要如此呢? 如果不限制0一定为队头,那样不就可以避免多次移动?

    所以也可以定义 font 指针和rear指针来指定头和尾的下一个位置。这样,当删除头的之后,头指针后移即可。

    即:如果删除0,则头指针指向1即可。

    在这里插入图片描述

    这样是解决了多次移动的问题,但是,这样子···下面的情况,a1和a2空间不就被浪费了吗?
    在这里插入图片描述

    所以我们可以使用循环队列解决这个问题,即当队列“假满”的时候,将队尾移动到a1,即可重新插入。
    在这里插入图片描述

    队列的链式存储结构

    其实就是单链表,不过只能尾进头出。

    对您有帮助,请点赞,谢谢~

  • 相关阅读:
    java 24
    java 24
    java 24
    java 24
    一个用httpPost,get访问外网接口,参数json,返回json的示例
    几个强大的oracle自带函数,可根据日期算年纪,根据数值匹配字段
    sql对日期的处理,一个存储过程示例
    一条sql,有分页,表合并查询,多表连接,用于oracle数据库
    后台返回data直接在页面转换
    JQuery的$和其它JS发生冲突的快速解决方法
  • 原文地址:https://www.cnblogs.com/ma-nong01/p/14323437.html
Copyright © 2011-2022 走看看