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

文章目录

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

🍋引言

队列(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.rhkb.cn/news/139082.html

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

相关文章

拼多多API接口解析,实现根据ID取商品详情

拼多多是一个流行的电商平台,它提供了API接口供开发者使用。要根据ID获取商品详情,您需要使用拼多多API接口并进行相应的请求。 以下是使用拼多多API接口根据ID获取商品详情的示例代码(使用Python编写): import requ…

​专业图像处理软件 Photoshop 2023 mac版本更新(ps2023中文)

​Photoshop 2023 mac是一款图像编辑和图形设计软件,广泛应用于专业人士和爱好者。它提供了许多工具和功能,用于创建、编辑和增强数字图像,包括图层、蒙版、滤镜和各种选择工具。Photoshop还支持多种文件格式,包括psD、JPEG、PNG和…

全套办公软件Office 2019 mac专业版功能

Microsoft office 2019 Beta for Mac 是一款办公软件套装,它包含常用的办公应用程序,如 Word、Excel、PowerPoint 和 Outlook 等。office 2019 Beta 版本是一个测试版本,旨在让用户提前体验下一个版本的 office 套件,以便用户可以…

全国职业技能大赛云计算--高职组赛题卷③(私有云)

全国职业技能大赛云计算--高职组赛题卷③(私有云) 第一场次题目:OpenStack平台部署与运维任务1 基础运维任务(5分)任务2 OpenStack搭建任务(15分)任务3 OpenStack云平台运维(15分&am…

2023!6招玩转 Appium 自动化测试

Appium是个什么鬼 Appium是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的。可用于IOS和Android以及firefox的操作系统。原生的应用是指用android或ios的sdk编写的应用,移动网页应用是指网页…

Leetcode198. 打家劫舍

https://leetcode.cn/problems/house-robber/description/ 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入&…

网络初识

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

layui框架学习(45: 工具集模块)

layui的工具集模块util支持固定条、倒计时等组件,同时提供辅助函数处理时间数据、字符转义、批量事件处理等操作。   util模块中的fixbar函数支持设置固定条(2.7版本的帮助文档中叫固定块),是指固定在页面一侧的工具条元素&…

机器学习第五课--广告点击率预测项目以及特征选择的介绍

这个项目的主要的目的是通过给定的广告信息和用户信息来预测一个广告被点击与否。 如果广告有很大概率被点击就展示广告,如果概率低,就不展示。 因为如果广告没有被点击,对双方(广告主、平台)来讲都没有好处。所以预测…

软件测试/测试开发丨利用人工智能ChatGPT自动生成架构图

点此获取更多相关资料 简介 架构图通过图形化的表达方式,用于呈现系统、软件的结构、组件、关系和交互方式。一个明确的架构图可以更好地辅助业务分析、技术架构分析的工作。架构图的设计是一个有难度的任务,设计者必须要对业务、相关技术栈都非常清晰…

【PLC GX Works2】创建一个工程

PLC GX Works2软件安装 https://www.jcpeixun.com/software/375 程序编写 1、工程中找到新建 2、新建 3、导航栏中选择第三行第一个,是全局软元件注释 4、修改软元件名x0为点动按钮,y1为电机,之后关闭即可。 5、左母线,右…

多输入多输出 | MATLAB实现GA-BP遗传算法优化BP神经网络多输入多输出

多输入多输出 | MATLAB实现GA-BP遗传算法优化BP神经网络多输入多输出 目录 多输入多输出 | MATLAB实现GA-BP遗传算法优化BP神经网络多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | MATLAB实现GA-BP遗传算法优化BP神经网络多输入多输出…

uniapp获取一周日期和星期

UniApp可以使用JavaScript中的Date对象来获取当前日期和星期几。以下是一个示例代码,可以获取当前日期和星期几,并输出在一周内的每天早上和晚上: // 获取当前日期和星期 let date new Date(); let weekdays ["Sunday", "M…

React(react18)中组件通信03——简单使用 Context 深层传递参数

React(react18)中组件通信03——简单使用 Context 深层传递参数 1. 前言1.1 React中组件通信的其他方式1.2 引出 Context 2. 简单例子3. 语法说明3.1 createContext(defaultValue)3.2 value3.3 useContext(SomeContext) 4. 总结4.1 Context4.1.1 Context…

解决方案| anyRTC远程检修应用场景

背景 在这个科技飞速发展的时代,各行各业都要求高效运转。然而,当出现问题时,我们却常常因为无法及时解决而感到困扰,传统解决问题的方式是邀请技术人员现场解决问题,如果技术人员解决不了,还要邀请专家从…

23年下考前须知-软考中级信息安全工程师

信息安全工程师主要涉及计算机信息安全方面,在计算机软硬件、网络、应用相关领域从事安全系统设计、安全产品开发、产品集成、信息系统安全检测与审计等方面工作,服务单位可以是国家机关、企事业单位及科研教学单位等。 一、考试报名时间 信安考试一年…

《深度学习工业缺陷检测》专栏介绍 CSDN独家改进实战

💡💡💡深度学习工业缺陷检测 1)提供工业小缺陷检测性能提升方案,满足部署条件; 2)针对缺陷样品少等难点,引入无监督检测; 3)深度学习 C、C#部署方案&#…

若依cloud -【 100 ~ 】

100 分布式日志介绍 | RuoYi 分布式日志就相当于把日志存储在不同的设备上面。比如若依项目中有ruoyi-modules-file、ruoyi-modules-gen、ruoyi-modules-job、ruoyi-modules-system四个应用,每个应用都部署在单独的一台机器里边,应用对应的日志的也单独存…

doxygen c++ 语法

c基本语法模板 以 /*! 开头, */ 结尾 /*!\关键字1\关键字2 */1 文件头部信息 /*! \file ClassA.h* \brief 文件说明 定义了类fatherA* \details This class is used to demonstrate a number of section commands.* \author John Doe* \author Jan Doe* \v…

虚拟机部署linux网络连接配置

1、虚拟机安装linux后,配置网络访问 虚拟机网络设置为NAT模式 linux网络配置好IP,主要是以下网络配置 2、linux没有ifconfig命令,ifconfig命令是在net-tools.x86_64包里 yum install net-tools.x86_64安装