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

栈、队列以及环形缓冲区

时间:2023-01-14 18:56:59浏览次数:45  
标签:函数 队列 读出 写入 环形 数组 缓冲区 数据

栈和队列,都可以不通过指定地址和索引来对数组的元素进行读写。需要临时保存计算过程中的数据、连接在计算机上的设备或者输入输出的数据时,都可以通过这些方法来使用内存。如果每次保存临时数据都需指定地址和索引,程序就会变得比较麻烦,因此要加以改进。
栈和队列的区别在于:数据出入的顺序是不同的。在对内存数据进行读写时,栈用的是LIFO(Last Input First Out,后入先出)方式,而队列用的则是FIFO(First Input First Out,先入先出)方式。如果我们在内存中预留出栈和队列所需要的空间,并确定好写入和读出的顺序,就不用再指定地址和索引了。
如果要在程序中实现栈和队列,就需要以适当的元素数来定义一个用来存储数据的数组,以及对该数组进行读写的函数对。当然,在这些函数的内部,对数组的读写会涉及索引的管理,但从使用函数的角度来说,就没有必要考虑数组及索引了。
循环处理(loop)是指反复多次进行同样的处理。
这里所说的栈并不是第1章及第10 章提到的函数调用时使用的栈,而是指程序员自身做成的LIFO形式的数据存储方式(该栈的实体是数组)。

这里,我们暂且把往栈中写入数据的函数命名为Push”,把从栈中读出数据的函数命名为Pop,把往队列中写入数据的函数命名为EnQueue,把从队列中读出数据的函数命名为DeQueue。Push和Pop以及EnQueue和DeQueue分别组成一对函数。Push和EnQueue用于为函数的参数传递要写入的数据。Pop和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个元素的数组来实现一个队列。这时可以从数组的起始位置开始有序地存储数据,然后再按照存储时的顺序把数据读出。在数组的末尾写入数据后,后一个数据就会被写入数组的起始位置(此时数据已经被读出所以该位置是空的)。这样,数组的末尾就和开头连接了起来,数据的写入和读出也就循环起来了(如下图):

 

 

 

标签:函数,队列,读出,写入,环形,数组,缓冲区,数据
From: https://www.cnblogs.com/2674308160-lucky/p/17052360.html

相关文章