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

    什么是栈?

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

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

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

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

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

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

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

    栈的顺序存储结构

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

    优点:

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

    缺点:

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

    栈的链式存储结构

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

    优点:

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

    缺点:

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

    总结

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

    递归

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

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

    队列

    什么是队列?

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

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

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

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

    顺序存储结构的队列

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

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

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

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

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

    在这里插入图片描述

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

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

    队列的链式存储结构

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

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

  • 相关阅读:
    Debug相关的一些小技巧
    <Information Storage and Management> 读书笔记 之二
    <<Information Storage and Management>>读书笔记 之三
    LINQ to SQL语句(2)之Select/Distinct【转】
    Asp.Net MVC实践 探索UrlRouting并分析UrlHelper (基于ASP.NET MVC Preview 3) 【转】
    MVC学习之分页 【转】
    在 ASP.NET MVC 项目中使用 WebForm 【转】
    Asp.net Mvc Codeplex Preview 5 第三篇 实现Action参数传递繁杂类型 【转】
    jQuery入门[1]-构造函数 【转】
    LINQ to SQL语句(1)之Where【转】
  • 原文地址:https://www.cnblogs.com/ma-nong01/p/14323437.html
Copyright © 2011-2022 走看看