zoukankan      html  css  js  c++  java
  • 数据结构03-栈和队列

    1.概述

        我们知道,程序就是用来处理数据的。对于每一件现实中的问题,我们也是将其抽象成数据+对数据的操作。所以数据的格式决定着我们操作他们的形式。

        我们可以想象在超市中排队结账的情景,很多人排成一条长队,而新来的人要排在队的后面,结账的人一定是在队列最前面的人。(不考虑没有素质的行为)

        我们还可以想象在我们将一件件衣服叠好,放在衣柜或者箱子里面的过程,最上面的一件,一定是最后放进去的,最下面的一定是第一件放进去的。。

        同理,在进算计中也有模拟这些情况的数据结构,我们称之为队列和栈。

    2.基本概念

        2.1 栈 

            栈是一种先进后出的数据结构,他要求只能对一端进行操作,每次只能操作处于逻辑最前面的元素。

            例如我们使用数组的时候,栈要求我们只能操作最后一个进入数组的元素(元素按顺序摆放,没有空隙)。

        2.2 队列

            队列是一种先进先出的数据结构,他要求同时对两端进行操作,但是要求逻辑头只能进行元素出队列(删除)操作;逻辑尾只能进行入队列(元素添加)操作,就好比排队一样。

        2.3 栈与队列的区别

            首先,栈与队列都是线性结构(使用数组或者顺序表实现),栈的特点是先进入的元素后出来,利用这种结构可以记录层级关系,例如函数调用关系,嵌套的层级关系,表达式的计算等。

            队列的特点是先进先出,利用这种结构可以记录顺序,例如消息的排序,记录操作的先后顺序等。

    3.栈的实现

        3.1 数组实现

            栈的数组实现非常简单,首先声明一个数组,然后再定义一个变量P用来保存当前操作位置,每次元素入栈就在P指定的位置入该元素,然后向前移动P的位置;每次出栈将当前P指向的元素删除,然后再向后移动

            P的位置。这样就保证了只对数组的一端进行操作,形成了栈结构。

        3.2 链表实现

             与数组类似,每次有新元素加入,就给链表的尾部加入一个新的节点;每次有元素出栈,就删除链表最后一个节点。

    4.队列的实现

        4.1 链表实现

              链表实现的队列比较简单,每次有新的元素加入,就在链表的尾部加入一个新节点;每次有元素出队列,就删除链表的第一个节点。

        4.2 数组实现

              队列的数组实现比较麻烦,他要求有两个变量 p、q分别表示当前队列的头和尾,每次有新元素,就放入队尾指针的位置,然后队尾指针向后移动;

              每次要出队列的时候就将队头指针的数据删除,然后队头指针向后移动。 可以发现,当进行一定次数的操作之后,由于队头指针向后移动,将导致整个数组资源浪费(即队头指针跑到了队尾),为了

              解决这个问题,循环队列就产生了

        4.3 循环队列

              循环队列就是逻辑上将数组头尾相接,形成一个圈,当队尾到达数组尾部的时候,由于之前出队列导致数组的头部并没有元素,这是我们可以将队尾元素存在这里,形成一个环,避免了资源浪费。

            

    5. 推荐阅读:

        1.栈原理及操作    2.队列原理及操作    3.循环队列

  • 相关阅读:
    任意数字 保留 两位 小数 PHP
    在JavaScript中处理JSON数据 jquery js 定义 json 格式
    相对定位 绝对定位 relative absolute position 图片定位a标签
    oracle: listener.ora 、sqlnet.ora 、tnsnames.ora的配置及例子
    python
    python
    python-判断alter是否存在
    python-IE浏览器调用
    Python语言编写脚本时,对日期控件的处理方式
    python报错UnicodeDecodeError:
  • 原文地址:https://www.cnblogs.com/xiaobai1202/p/10856154.html
Copyright © 2011-2022 走看看