首页 > 其他分享 >4.5 栈、队列以及环形缓冲区

4.5 栈、队列以及环形缓冲区

时间:2023-02-09 20:47:55浏览次数:45  
标签:4.5 函数 队列 读出 写入 数组 缓冲区 数据

栈和队列

栈和队列,都可以不通过指定地址和索引来对数组的元素进行读写。需要临时保存计算过程中的数据、连接在计算机上的设备或者输入输出的数据时,都可以通过这些方法来使用内存。如果每次保存临时数据都需指定地址和索引,程序就会变得比较麻烦。

栈和队列的区别在于:数据出入的顺序是不同的。在对内存数据进行读写时,栈用的是LIFO(Last Input First Out,后入先出)方式,而队列用的则是FIFO(First Input First Out,先入先出)方式。如果我们在内存中预留出栈和队列所需要的空间,并确定好写入和读出的顺序,就不用再指定地址和索引了。

在程序中实现栈和队列:需要以适当的元素数来定义一个用来存储数据的数组,以及对该数组进行读写的函数对。当然,在这些函数的内部,对数组的读写会涉及索引的管理,但从使用函数的角度来说,就没有必要考虑数组及索引了。

这里所说的并不是第1章及第10 章提到的函数调用时使用的栈,而是指程序员自身做成的LIFO形式的数据存储方式(该栈的实体是数组)。

上图示例中,把往栈中写入数据的函数命名为Push”,把从栈中读出数据的函数命名为Pop,把往队列中写入数据的函数命名为EnQueue,把从队列中读出数据的函数命名为DeQueue。Push和Pop以及EnQueue和DeQueue分别组成一对函数。通过使用这些函数,可以将数据临时保存(写入),然后再在需要时候把这些数据读出来(代码清单4-4、代码清单4-5)。

①汇编语言中有push和pop两个指令,但这里指的是程序员为了以LIFO形式对数组进行读写而做成的Push函数和Pop函数。

② 通常情况下,往栈写入数据称为Push(入栈),从栈中读出数据称为Pop(出栈)。往队列中写入数据称为EnQueue(入列),从队列中读出数据称为DeQueue(出列)。这里直接把它们各自的英文名称作为函数名字使用了。

在栈中,LIFO 方式表示栈的数组中所保存的最后面的数据(Last In)会被最先读取出来(First Out)。代码清单4-4的程序运行后,按照123、456、789的顺序写入的数据,结果却按照789、456、123的顺序被读取出来(如下图):

与栈相对的是队列,顾名思义,FIFO方式表示队列的数组中所保存的最初数据(First Input)会最先被读取出来(First Out)。代码清单4-5中的程序运行后,按照123、456、789的顺序写入的数据,结果会按照123、456、789的顺序被读取出来(如下图):

队列这一方式也称为排队。排队指的是买车票时在自动售票机前等候的队列等。排队时,站在最前面的乘客先买票,购买后率先从队列中走出来。当随机前来的购票乘客数量和自动售票机的处理速度不相符时,排队能起到很好的缓冲作用。程序中也是如此,为了协调好数据输入和处理时机间的关系,采用类似于排队的机制是很方便的。在内存上,实现这种机制的方式就是队列。当我们需要处理通讯中发送的数据时,或由同时运行的多个程序所发送过来的数据时,会用到这种对队列中存储的不规则数据进行处理的方法。

环形缓冲区

队列一般是以环状缓冲区(ring buffer)的方式来实现的,也就是本章标题中所说的“熟练使用有棱有角的内存”。

例如,假设我们要用有6个元素的数组来实现一个队列。这时可以从数组的起始位置开始有序地存储数据,然后再按照存储时的顺序把数据读出。在数组的末尾写入数据后,后一个数据就会被写入数组的起始位置(此时数据已经被读出所以该位置是空的)。这样,数组的末尾就和开头连接了起来,数据的写入和读出也就循环起来了(如下图):

 

 

标签:4.5,函数,队列,读出,写入,数组,缓冲区,数据
From: https://www.cnblogs.com/ttmeng/p/17106957.html

相关文章

  • 剑指offer——Day27 栈与队列(困难)
    Day272023.2.9栈&队列(困难)剑指Offer59-Ⅰ.滑动窗口的最大值自己实现这种滑动窗口的题直接用双指针来做了,做出来了,正确性是对的,但是时间太长了,超出时间限制了,先把......
  • 算法15:冷门面试题_队列实现栈,栈实现队列
     经常有些面试官很变态,一般都是老阴逼级别的,喜欢问一些变态的问题。但是,反过来思考一下,这些题目也确实具备一些动手的能力,变相能够考查面试者的coding能力。面试一:怎么......
  • C/C++ 数据结构链式队列的定义与实现
    #include<iostream>#include<Windows.h>usingnamespacestd;typedefstruct_QNode{intdata;struct_QNode*next;}QNode;typedefstruct{QNode......
  • 消息队列解析Message
    消息队列生产者@AutowiredprivatefinalAmqpTemplateamqpTemplate;publicvoidtest(){Map<String,Object>testMap=Maps.newHashMap();testMap.put(......
  • 由一次生产事故思考队列在实际项目中的应用价值
    话说从一名.Neter转到Java开发也已经有3年多时间了,期间也积累了一些经验。今天就来谈谈RabbitMQ在实际项目中的应用。那是2020年的某个周末,突然收到反馈,商城页......
  • 队列的顺序存储
      #include<iostream>usingnamespacestd;#defineMAXSize10typedefintElemtype;typedefstruct{ Elemtypedata[MAXSize]; intfront,rear;}SqQueue;boolIsEmp......
  • 【tyvj1305】最大子序和(单调队列)
    problem给你一个长为n的序列求一个长不超过m的连续子段,使子段和最大solution如果n<=10^3,我们很容易写出枚举(s是前缀和,区间[l,r]的和就是s[r]-s[l-1]。枚举l,r即可。for(int......
  • 【POJ2259】Team Queue(队列,模拟)
    problem有n个小组,进行排队。当一个人来到队伍时,若队伍中有自己小组成员时,他就直接站到其后面如果没有,则站到队伍最后面,形成自己小组的第一个入队元素。出队列时,给出出队指令......
  • 阻塞式并发队列
    --BlockingQueue:阻塞式队列--可以实现生产者消费者模式 --LinkedBQ:链表实现    --ArrayBQ:数组实现,有限队列    --Delay......
  • OpenHarmony开发15 —— 消息队列
    OpenHarmony开发15——消息队列说点别的,这几天没更新真的是被这个消息队列折磨完了,谁知道鬼鸿蒙它不进行任何提示!为什么stackoverflow会不提示啊!!!太折磨了太折磨了......