深入了解队列数据结构:定义、特性和实际应用

文章目录

  • 🍋引言
  • 🍋队列的定义
  • 🍋队列的实现
  • 🍋队列的应用
  • 🍋练习题
  • 🍋结语

🍋引言

队列(Queue)是计算机科学中一种重要的数据结构,它常用于各种应用程序中,包括操作系统、网络通信、任务调度和数据处理。队列遵循特定的数据存储和操作规则,本文将深入探讨队列的定义、特性以及一些实际应用场景。

🍋队列的定义

队列是一种线性数据结构,它遵循“先进先出”(First-In-First-Out,FIFO)的原则。这意味着最先进入队列的元素将首先被移出队列,而最后进入队列的元素将最后被移出。队列通常支持以下两个主要操作:

  • 入队(Enqueue):将元素添加到队列的末尾。
  • 出队(Dequeue):从队列的开头移除元素。

队列还可以包括以下基本属性:

  • 队头(Front):队列的开头元素,最早添加的元素。
  • 队尾(Rear):队列的末尾元素,最后添加的元素。
  • 大小(Size):队列中元素的数量。

🍋队列的实现

队列可以通过不同的数据结构来实现,包括数组和链表。根据需求和应用场景的不同,选择不同的实现方式。下面是一个使用Python列表实现队列的示例:

class Queue:def __init__(self):self.items = []def enqueue(self, item):self.items.append(item)def dequeue(self):if not self.is_empty():return self.items.pop(0)def front(self):if not self.is_empty():return self.items[0]def is_empty(self):return len(self.items) == 0def size(self):return len(self.items)

🍋队列的应用

  1. 任务调度

队列常用于任务调度,例如操作系统中的进程调度、打印队列中的打印任务等。新任务入队,系统按照FIFO原则处理任务。

  1. 广度优先搜索(BFS)

在图论和算法中,广度优先搜索算法使用队列来遍历图的节点。它以广度优先的方式搜索节点,用于查找最短路径、解决迷宫问题等。

  1. 缓存管理

队列可用于实现缓存。最近访问的数据在队列的前面,而较早访问的数据在队列的后面。当缓存满时,最不常用的数据将从队列的末尾移除。

  1. 线程池

线程池使用队列来管理待执行的任务。新任务入队,线程池中的线程按照FIFO原则获取任务并执行。

  1. 消息队列

消息队列用于实现异步通信和解耦,常见于分布式系统和消息中间件。消息按照顺序排队,消费者从队列中获取并处理消息。

🍋练习题

题目1: 设计一个循环队列(Circular Queue)类,包含以下操作:

MyCircularQueue(k):构造一个大小为 k 的循环队列。
enQueue(value):向队列尾部插入一个元素。如果队列已满,则返回 False。
deQueue():从队列头部删除一个元素。如果队列为空,则返回 False。
Front():获取队列头部的元素。如果队列为空,则返回 -1。
Rear():获取队列尾部的元素。如果队列为空,则返回 -1。
isEmpty():检查队列是否为空。
isFull():检查队列是否已满。
class MyCircularQueue:def __init__(self, k):"""Initialize your data structure here. Set the size of the queue to be k."""self.queue = [None] * k  # 使用固定大小的列表来表示循环队列self.size = kself.front = self.rear = -1  # 初始化队头和队尾指针def enQueue(self, value):"""Insert an element into the circular queue. Return true if the operation is successful."""if self.isFull():return False  # 如果队列已满,插入失败if self.isEmpty():self.front = 0  # 如果队列为空,设置队头为0self.rear = (self.rear + 1) % self.size  # 更新队尾指针self.queue[self.rear] = valuereturn Truedef deQueue(self):"""Delete an element from the circular queue. Return true if the operation is successful."""if self.isEmpty():return False  # 如果队列为空,删除失败if self.front == self.rear:self.front = self.rear = -1  # 如果队列只有一个元素,删除后将队头和队尾指针置为-1else:self.front = (self.front + 1) % self.size  # 更新队头指针return Truedef Front(self):"""Get the front item from the queue."""if self.isEmpty():return -1  # 如果队列为空,返回-1return self.queue[self.front]def Rear(self):"""Get the last item from the queue."""if self.isEmpty():return -1  # 如果队列为空,返回-1return self.queue[self.rear]def isEmpty(self):"""Checks whether the circular queue is empty or not."""return self.front == self.rear == -1def isFull(self):"""Checks whether the circular queue is full or not."""return (self.rear + 1) % self.size == self.front
  • init(self, k):构造函数初始化一个大小为 k 的循环队列,使用固定大小的列表 self.queue 来存储元素,同时初始化队头和队尾指针为 -1。

  • enQueue(self, value):将元素插入队列尾部,如果队列已满,则插入失败。这里使用取余运算来实现循环队列的队尾指针更新。

  • deQueue(self):从队头删除元素,如果队列为空,则删除失败。同样使用取余运算更新队头指针。

  • Front(self):获取队头元素,如果队列为空,则返回 -1。

  • Rear(self):获取队尾元素,如果队列为空,则返回 -1。

  • isEmpty(self):检查队列是否为空,如果队头和队尾指针均为 -1,则队列为空。

  • isFull(self):检查队列是否已满,使用取余运算判断队尾指针是否在队头之前。

下面是代码的调用

# 创建大小为 3 的循环队列
cq = MyCircularQueue(3)# 插入元素 1、2 和 3
print(cq.enQueue(1))  # True
print(cq.enQueue(2))  # True
print(cq.enQueue(3))  # True# 队列已满,插入失败
print(cq.enQueue(4))  # False# 获取队头元素和队尾元素
print(cq.Front())  # 1
print(cq.Rear())   # 3# 删除队头元素
print(cq.deQueue())  # True

🍋结语

队列是一种重要的数据结构,它在计算机科学和编程中具有广泛的应用。了解队列的特性和实现方式,能够更好地解决各种问题,提高程序的效率和可维护性。希望这篇博客能够帮助你深入理解队列的概念和应用。

请添加图片描述

挑战与创造都是很痛苦的,但是很充实。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive【Hive(一)DDL】

前置准备 需要启动 Hadoop 集群,因为我们 Hive 是在 Hadoop 集群之上运行的。 从DataGrip 或者其他外部终端连接 Hive 需要先打开 Hive 的 metastore 进程和 hiveserver2 进程。metastore 和 hiveserver2 进程的启动过程比较慢,不要着急。 Hive DDL 数据…

基于SpringBoot的网上超市系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 管理员功能实现 用户功能实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计…

微软在Windows 11推出Copilot,将DALL-E 3集成在Bing!

美东时间9月21日,微软在美国纽约曼哈顿举办产品发布会,生成式AI成为重要主题之一。 微软表示,Copilot将于9月26日在Windows 11中推出;Microsoft 365 Copilot 将于11 月1日向企业客户全面推出;将OpenAI最新的文本生成图…

【论文阅读 08】Adaptive Anomaly Detection within Near-regular Milling Textures

2013年,太老了,先不看 比较老的一篇论文,近规则铣削纹理中的自适应异常检测 1 Abstract 在钢质量控制中的应用,我们提出了图像处理算法,用于无监督地检测隐藏在全局铣削模式内的异常。因此,我们考虑了基于…

GitHub Copilot Chat

9月21日,GitHub在官网宣布,所有个人开发者可以使用GitHub Copilot Chat。用户通过文本问答方式就能生成、检查、分析各种代码。 据悉,GitHub Copilot Chat是基于OpenAI的GPT-4模型打造而成,整体使用方法与ChatGPT类似。例如&…

TouchGFX之画布控件

TouchGFX的画布控件,在使用相对较小的存储空间的同时保持高性能,可提供平滑、抗锯齿效果良好的几何图形绘制。 TouchGFX 设计器中可用的画布控件: LineCircleShapeLine Progress圆形进度条 存储空间分配和使用​ 为了生成反锯齿效果良好的…

华为云云耀云服务器L实例评测 | minikube部署和使用

### 1 安装Docker 按照官网[Docker docs](https://docs.docker.com/engine/install/centos/)指引安装: shell yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install docker-ce docker-…

[C++随笔录] vector模拟实现

vector模拟实现 基本结构天选之子构造拷贝构造析构operator 空间reserveresizesize && capacity 增insertpush_back 删erasepop_back 查 && 改swapoperator[] 源码 基本结构 // 可以是不同类型, 用类模板 template <class T> class vector { public:// 源…

git和github的入门操作

之前因为工作中用的都是SVN版本控制工具&#xff0c;没接触过git和github&#xff0c;现在开始深入自学Django框架技术后&#xff0c;看到官网推荐使用git&#xff0c;然后这两天网上查阅了很多文章教程&#xff0c;学到入门操作需要学习的点&#xff0c;太多的知识点要后面慢慢…

Mac配置iTerm样式终端

一、MacOs系统 MacOs中终端使用iTerm2 1. 配置oh-my-zsh oh my zsh 的地址&#xff1a; https//github.com/ohmyzsh/ohmyzsh 插件存放位置&#xff1a;~/.oh-my-zsh/plugins 下载常用的插件 git clone http://github.com/zsh-users/zsh-syntax-highlighting.git 修改配…

英伟达 nvidia 官方code llama在线使用

新一代编程语言模型Code Llama面世&#xff1a;重新定义编程的未来 随着人工智能和机器学习技术的迅速发展&#xff0c;我们现在迎来了一款革命性的大型编程语言模型——Code Llama。该模型是基于Llama 2研发的&#xff0c;为开放模型中的佼佼者&#xff0c;其性能达到了行业领…

React组件化开发

1.组件的定义方式 函数组件Functional Component类组件Class Component 2.类组件 export class Profile extends Component {render() {console.log(this.context);return (<div>Profile</div>)} } 组件的名称是大写字符开头&#xff08;无论类组件还是函数组件…

MyBatisPlus(四)表映射:@TableName

表映射 数据库中的表名&#xff0c;和项目中的实体类名&#xff0c;并不相同&#xff0c;则需要通过注解TableName来进行映射。 未映射前报错示例 数据库表名&#xff1a;tb_user 实体类名&#xff1a;User 测试代码 Autowiredprivate UserMapper userMapper;Testvoid selec…

CUDA和cuDNN的安装

参考资料&#xff1a;https://zhuanlan.zhihu.com/p/83971195 目录 CUDA和cuDNN介绍安装验证 CUDA和cuDNN介绍 CUDA(ComputeUnified Device Architecture)&#xff0c;是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构&#xff0c;该架构使GPU能够…

网络初识

一 IP 地址 概念: IP 地址主要用于表示网络主机、其他网络设备&#xff08;如路由器&#xff09;的网络地址。简单说&#xff0c;IP地址用于定位主机的网络地址 格式 IP 地址是一个32为的二进制数&#xff0c;通常被分割为4个“8位二进制数“&#xff08;也就是4个字节&…

排序算法(一)

排序算法(一&#xff09; 冒泡排序选择排序插入排序希尔排序堆排序 冒泡排序 冒泡排序是一种十分稳定的排序&#xff0c;其思想是通过两两比较&#xff0c;改变位置&#xff0c;从而每次让一个数出现在其该出现的位置该排序由于很稳定&#xff0c;所以不论数据是否有序&#xf…

什么是语法糖?Java中有哪些语法糖?

什么是语法糖&#xff1f;Java中有哪些语法糖&#xff1f; 语法糖 语法糖&#xff08;Syntactic Sugar&#xff09;&#xff0c;也称糖衣语法&#xff0c;是由英国计算机学家 Peter.J.Landin 发明的一个术语&#xff0c;指在计算机语言中添加的某种语法&#xff0c;这种语法对…

小米笔试题——01背包问题变种

这段代码的主要思路是使用动态规划来构建一个二维数组 dp&#xff0c;其中 dp[i][j] 表示前 i 个产品是否可以组合出金额 j。通过遍历产品列表和可能的目标金额&#xff0c;不断更新 dp 数组中的值&#xff0c;最终返回 dp[N][M] 来判断是否可以组合出目标金额 M。如果 dp[N][M…

thinkphp8路由

thinkphp8已出来有好一段时间了。这些天闲来无事&#xff0c;研究了下tp8的路由。默认情况下&#xff0c;tp8的路由是在route\app.php的文件里。但在实际工作中&#xff0c;我们并不会这样子去写路由。因为这样不好管理。更多的&#xff0c;是通过应用级别去管理路由。假如项目…