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

文章目录

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

🍋引言

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

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

相关文章

SoftwareTest3 - 要了人命的Bug

软件测试基础篇 一 . 如何合理的创建一个 Bug二 . Bug 等级2.1 崩溃2.2 严重2.3 一般2.4 次要 三 . Bug 的生命周期四 . 跟开发产生争执应该怎么解决 Hello , 大家好 , 又给大家带来新的专栏喽 ~ 这个专栏是专门为零基础小白从 0 到 1 了解软件测试基础理论设计的 , 虽然还不足…

php之导入导出csv文件

一、导入csv文件 1、创建导入页面 <!DOCTYPE html> <html lang"zh-CN"> <meta charset"UTF-8"> <head><title>文件提交表单</title> </head> <body> <form action"test5.php" method"…

【软件测试】测试中的风险有哪些?

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; ​那么到底都有哪些风险要注意呢?如何解决呢?另外这些风险如何在计划中写明呢&#xff0c;不会写“张三…

CTF 全讲解:[SWPUCTF 2021 新生赛]jicao

文章目录 参考环境题目index.phphighlight_file()include()多次调用&#xff0c;多次执行单次调用&#xff0c;单次执行 $_POST超全局变量HackBarHackBar 插件的获取 $_POST打开 HackBar 插件通过 HackBar 插件发起 POST 请求 GET 请求查询字符串超全局变量 $_GET JSONJSON 数据…

Android Studio 创建项目不自动生成BuildConfig文件

今天在AS上新建项目发现找不到BuildConfig文件&#xff0c;怎么clear都不行。通过多方面查找发现原来gradle版本不同造成的&#xff0c;Gradle 8.0默认不生成 BuildConfig 文件。 如上图&#xff0c;8.0版本是没有source文件夹 上图是低于8.0版本有source文件夹 针对这个问题&…

Unity打包出来的APK文件有问题总结

一、Unity打包出来的APK文件安装失败&#xff0c;提示安装失败&#xff08;-108&#xff09;&#xff0c;或者是提示“包含病毒&#xff1a;a.gray.Bulimia.b” 有可能是遇到如上图所示的问题&#xff0c;提示安装失败&#xff08;-108&#xff09;。 有可能是遇到如上图所示的…

基于微信小程序快递取件上门预约服务系统设计与实现(开题报告+任务书+源码+lw+ppt +部署文档+讲解)

文章目录 前言运行环境说明用户的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌…

idea更改java项目名

做了一个普通的java项目&#xff08;使用socket进行网络通信的练手项目&#xff09;&#xff0c;需要更改项目名&#xff0c;更改过程记录在这里。 修改项目名可能会出现很多错误&#xff0c;建议先备份当前项目 1.在idea里&#xff0c;右键项目名——》选择Refactor——》选择…

java框架-Springboot3-基础特性+核心原理

文章目录 java框架-Springboot3-基础特性核心原理profiles外部化配置生命周期监听事件触发时机事件驱动开发SPISpringboot容器启动过程自定义starter java框架-Springboot3-基础特性核心原理 profiles 外部化配置 生命周期监听 事件触发时机 事件驱动开发 Component public c…

认识面向对象-PHP8知识详解

面向对象编程&#xff0c;也叫面向对象程序设计&#xff0c;是在面向过程程序设计的基础上发展而来的&#xff0c;它比面向过程编程具有更强的灵活性和扩展性。 它用类、对象、关系、属性等一系列东西来提高编程的效率&#xff0c;其主要的特性是可封装性、可继承性和多态性。…

Linux 操作技巧

目录 一、shell-命令解释器 二、Linux中的特殊符号 三、命令历史--history 一、shell-命令解释器 shell——壳&#xff0c;命令解释器&#xff0c;负责解析用户输入的命令 ——内置命令&#xff08;shell内置&#xff09; ——外置命令&#xff0c;在文件系统的某个目录下&…

小程序社区团购demo

概述 实现了用户登录或者手机号&#xff0c;加入团长&#xff0c;邀请团长&#xff0c;各种佣金明细等页面 详细 需求&#xff1a; 根据市场信息反馈&#xff0c;社区团购比较火&#xff0c;有流量的用户可以推广页面 实现了功能&#xff1a; 实现了用户微信登录自动获取…