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

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

时间:2023-02-05 11:02:23浏览次数:40  
标签:4.5 函数 队列 读出 写入 数组 缓冲区 数据

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

栈和队列的区别在于:数据出入的顺序是不同的。在对内存数据进行读写时,栈用的是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个元素的数组来实现一个队列。这时可以从数组的起始位置开始有序地存储数据,然后再按照存储时的顺序把数据读出。在数组的末尾写入数据后,后一个数据就会被写入数组的起始位置(此时数据已经被读出所以该位置是空的)。这样,数组的末尾就和开头连接了起来,数据的写入和读出也就循环起来了(如下图):

 

 

 

 

 

 

 

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

相关文章

  • System V消息队列
    概述:消息队列是进程通信的一种方式。头文件:#include<sys/types.h>#include<sys/msg.h>一、创建或打开一个消息队列intmsgget(key_tkey,intmsgflg);参数key......
  • Nginx之资源压缩,大文件传输,缓冲区,缓冲机制,IP黑白名单,跨域,防盗链
    目录1Nginx1.1资源压缩1.2大文件传输配置1.3Nginx缓冲1.3.1Nginx缓冲区1.3.2Nginx缓存机制1.3.3缓存清理1.4Nginx实现IP黑白名单1.5Nginx跨域配置1.5.1跨域问题......
  • 数组-链表-栈-队列(下)
    LeetCode66.加一(模板题)给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位,数组中每个元素只存储单个数字。你可以......
  • C/C++ 实现循环队列
    #include<iostream>#include<Windows.h>usingnamespacestd;#defineMAXSIZE6typedefintQElemType;typedefstruct{QElemType*base;//基地址intr......
  • RabbitMq:简单的生产者代码。(包含QueueDeclare声明队列参数)
    ConnectionFactoryconn=newConnectionFactory();conn.setVirtualHost("/");conn.setPort(5672);......
  • 57-Zookeeper集群和kafka消息队列集群
    MartinFowler发现所有成功的微服务都遵循了通用的模式-MonolithFirst(单体优先):几乎所有成功的微服务故事,都是从一个变得太大而被分解的单体开始的。几乎所有我听说过的从......
  • 【kafka 消息队列&基础命令】
    一、kafka的定义传统定义:kafka是一个分布式的基于发布/订阅模式的消息队列发布订阅:消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者......
  • 高性能内存队列Disruptor
    1背景Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系......
  • 双端队列
    题目描述:达达现在碰到了一个棘手的问题,有N个整数需要排序。达达手头能用的工具就是若干个双端队列。她从1到N需要依次处理这N个数,对于每个数,达达能做以下两件事:1.新建一个双......
  • springcloud:安装rabbitmq并配置延迟队列插件
    0.引言本期主要讲解如何利用docker快速安装rabbitmq并且配置延迟队列插件1.docker安装1.1安装rabbitmq1、下载镜像dockerpullrabbitmq2、安装镜像dockerrun-d--host......