zoukankan      html  css  js  c++  java
  • 栈和队列

    (Stack),又名堆栈,是一种数据结构的应用,本质是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。

    插入元素和删除元素的一端被称为栈顶,相对的,另一端则被称为栈底,栈中元素个数为零的时被称为空栈,函数执行的环境:栈帧就是一个函数执行的环境函数的参数,函数的局部变量,函数执行完后返回地址,每个栈帧对应着一个未运行完的函数,所以栈帧也叫过程活动记录。

    向一个栈插入新元素又被称为是进栈,入栈,或者压栈,是把新元素放在栈顶元素上方,使其称为新的栈顶元素。从一个栈取出元素又被称为出栈或者退栈,就是把栈顶元素删除,使其下方相邻的元素称为新的栈顶元素。

    LIFO(Last In First Out 后进先出)由于这一特性,可以使用线性表中的顺序表或链表实现

    使用顺序表实现的时候,以顺序表的尾端作为栈顶(因为对顺序表的操作是常量操作)

    使用链表实现的时候,以链表的顶端作为栈顶(因为对链表的操作是常量操作)

    生活中类似的例子:羽毛球盒子就可以看作是一个栈,总是把羽毛球从其中一个口塞入和取出。

    实际应用场景:函数的调用,入栈就是把新的函数所用到的参数和局部变量,作为一个新的栈帧,变成栈顶,这样就把各个函数的局部变量就隔离开。出栈就是函数的返回

    递归的实现:递归需要保存正在计算的上下文,等待当前计算完成后弹出,再继续计算,只有栈先进后出的特性才能实现。

    栈溢出的原因:(栈溢出就是内存不够用 )

    1.函数调用太深(Python递归函数调用1000次左右)

    2.函数的局部变量太大(一个局部变量就把一个栈帧撑的特别大,一个栈帧就占用了一个栈)

    3.函数的参数太多(一个栈帧中存不完这个函数所有的参数)

    队列(Queue),是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,它是一种操作受限制的线性表。

    进行插入操作的端被称为队尾,进行删除操作的端称为队尾,队列中没有元素,称为空队列。

    FIFO(First In First Out 先进先出)由于这一特性,可以使用线性表中的顺序表或链表实现

    FIFO扩展:Linux中一种文件类型,就是一种队列文件,或者管道文件。用于进程间的通讯。

    生活中类似的例子:水管,一头进水,另一头出水。

    实际应用场景:进程间通讯

    建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理,一个是对头指针front,它指向对头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置,具体操作:是每次在队尾插入一个元素时,rear增1;每次在对头删除一个元素时,front增1,随着插入和删除的操作的进行,队列元素的个数不断变化,队列所占的存储空间也在为队列结构分配的连续空间中移动,当front=rear时,队列中没有任何元素,称为空队列。当rear增加到指向分配的连续空间之外时,队列无法再插入新元素,但这时往往还有大量可用空间未被占用,这些空间是已经出队的队列元素曾经占用过的存储单元。

    队列中溢出的现象:

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

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

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

    循环队列

    在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进,无论插入或删除,一旦rear指针增1或front指针增1时超出了所分配的队列空间,就让它指向这片空间的起始位置。这实际上是把队列空间想象成一个环形空间,唤醒空间中的存储单元循环使用,用这种方法管理的队列就成为循环队列。除了一些简单的应用外,真正实用的队列就是循环队列,循环队列解决了“假上溢”现象。

  • 相关阅读:
    谷歌浏览器提示Adobe Flash Player因过期而遭到阻止
    Oracle 查看表空间剩余与创建空间语法
    招标
    iphone刷机各种错误
    oracle 创建dblink
    imp-00002 无法打开。。
    oracle 大字段clob检索
    (一)EasyUI 使用——基本概念
    使用 Google 高级搜索的一些技巧
    (四)Maven构建多模块项目
  • 原文地址:https://www.cnblogs.com/yungiu/p/10136080.html
Copyright © 2011-2022 走看看