【7】数据结构的队列篇章

news2025/4/6 23:02:32

目录标题

    • 队列的定义
    • 顺序队列的实现
      • 初始化
      • 入队
      • 出队
      • 顺序队列总代码与调试
    • 循环队列的实现
      • 初始化
      • 入队
      • 出队
      • 获取队首元素
      • 循环队列总代码与调试
    • 链式队列的实现
      • 链式队列的初始化
      • 入队
      • 出队
      • 获取队首元素
      • 链式队列总代码与调试

队列的定义

  • 定义:队列(Queue)是一种常见的数据结构,它遵循“先进先出”(First In First Out,FIFO)的原则。类似于排队买票的情况,排在前面的先离开队列,后面来的排在队尾。
  • 特点:
    • 队列只允许在一端删除,在另一端插入的线性表
    • 允许删除的一端称为队首,允许插入的一端称为队尾
    • 向队列中插入元素称入队,从队列中删除元素称为出队
  • 队列示意图

在这里插入图片描述

顺序队列的实现

初始化

class SeqQueue:
    """
    顺序队列的定义
    """
    def __init__(self, max):
        """
        顺序队列的初始化
        :param max: 队列大小
        """
        self.max = max

        # 存储队列元素
        self.data = [None for i in range(self.max)]
        # 队首指针
        self.front = 0
        # 队尾指针
        self.rear = 0

入队

  • 核心思想
    • 检查队列是否已满
    • 在队尾插入元素值
    • 队尾指针加1
  • 入队示意图

在这里插入图片描述

  • 代码实现
    def enter(self, data):
        """
        入队
        :param data: 入队元素
        :return:
        """
        # 队满情况
        if self.rear == self.max:
            raise IndexError('队列已满')
        # 在队尾插入新的关键字
        self.data[self.rear] = data
        # 队尾指针加1
        self.rear += 1

出队

  • 核心思想
    • 检查队列是否为空
    • 获取队首元素
    • 队首指针front向后移动一格
  • 出队示意图

在这里插入图片描述

  • 代码实现
    def delete(self):
        """
        出队
        :return: 出队元素
        """
        # 队空
        if self.front == self.rear:
            raise IndexError('队空')
        # 获取出队元素
        data = self.data[self.front]
        # 队首指向下一个元素位置
        self.front += 1
        return data

顺序队列总代码与调试

# 10.顺序队列
class SeqQueue:
    """
    顺序队列的定义
    """
    def __init__(self, max):
        """
        顺序队列的初始化
        :param max: 队列大小
        """
        self.max = max

        # 存储队列元素
        self.data = [None for i in range(self.max)]
        # 队首指针
        self.front = 0
        # 队尾指针
        self.rear = 0

    def enter(self, data):
        """
        入队
        :param data: 入队元素
        :return:
        """
        # 队满情况
        if self.rear == self.max:
            raise IndexError('队列已满')
        # 在队尾插入新的关键字
        self.data[self.rear] = data
        # 队尾指针加1
        self.rear += 1
    def delete(self):
        """
        出队
        :return: 出队元素
        """
        # 队空
        if self.front == self.rear:
            raise IndexError('队空')
        # 获取出队元素
        data = self.data[self.front]
        # 队首指向下一个元素位置
        self.front += 1
        return data


if __name__ == '__main__':

    print('PyCharm')
    # 10.队列
    seqQueue = SeqQueue(8)
    # 10.1入队
    seqQueue.enter(10)
    seqQueue.enter(20)
    seqQueue.enter(30)
    # 10.2出队
    data = seqQueue.delete()
    print('当前出队元素:', data)
    data = seqQueue.delete()
    print('当前出队元素:', data)
    # 入队
    seqQueue.enter(40)
    seqQueue.enter(50)
    seqQueue.enter(60)
    # 出队
    data = seqQueue.delete()
    print('当前出队元素:', data)

    data = seqQueue.delete()
    print('当前出队元素:', data)
    
    data = seqQueue.delete()
    print('当前出队元素:', data)

循环队列的实现

  • 顺序队列易出现队列溢出的情况,针对这种情况的解决思路,设计了循环队列的线性表。
  • 顺序队列中存在的假溢出现象

在这里插入图片描述

  • 循环队列的出入队解决情况

在这里插入图片描述

  • 设定
    • 队首取下一个位置为:(front + 1) % max
    • 队尾取下一个位置为:(rear + 1) % max
    • 队空:front == rear
    • 队满:(rear + 1) % max == front

初始化

  • 初始化
class CSeqQueue:
    """
    顺序队列的定义
    """
    def __init__(self, max):
        """
        顺序队列的初始化
        :param max: 队列大小
        """
        self.max = max

        # 存储队列元素
        self.data = [None for i in range(self.max)]
        # 队首指针
        self.front = 0
        # 队尾指针
        self.rear = 0
  • 是否为空
    def isEmpty(self):
        """
        循环队列是否为空
        :return: true or false
        """
        return self.front ==self.rear

入队

  • 核心思想
    • 检查队列是否已满
    • 在队尾插入元素值
    • 取队尾的下一个位置
  • 代码实现
    def enter(self, data):
        """
        入队
        :param data: 入队元素
        :return:
        """
        # 队列满的情况
        if(self.rear + 1)% self.max == self.front:
            raise IndexError('队列已满')
        # 在队尾插入data
        self.data[self.rear] = data
        # 修改队尾指针
        self.rear = (self.rear + 1) % self.max

出队

  • 核心思想
    • 检查队列是否为空
    • 获取队首元素
    • 取队首的下一个位置
  • 代码实现
    def delete(self):
        """
        出队
        :return: 返回队首元素
        """
        # 队空
        if self.isEmpty():
            raise IndexError('队列为空')
        # 获队首元素
        data = self.data[self.front]
        # 修改队首指针
        self.front = (self.front + 1) % self.max
        #返回
        return data

获取队首元素

    def peak(self):
        """
        获取队首元素
        :return: 队首元素
        """
        # 队空
        if self.isEmpty():
            raise IndexError('队列为空')
        # 返回队首元素
        return self.data[self.front]

循环队列总代码与调试

# 11.循环队列
class CSeqQueue:
    """
    顺序队列的定义
    """
    def __init__(self, max):
        """
        顺序队列的初始化
        :param max: 队列大小
        """
        self.max = max

        # 存储队列元素
        self.data = [None for i in range(self.max)]
        # 队首指针
        self.front = 0
        # 队尾指针
        self.rear = 0

    def isEmpty(self):
        """
        循环队列是否为空
        :return: true or false
        """
        return self.front ==self.rear

    def enter(self, data):
        """
        入队
        :param data: 入队元素
        :return:
        """
        # 队列满的情况
        if(self.rear + 1)% self.max == self.front:
            raise IndexError('队列已满')
        # 在队尾插入data
        self.data[self.rear] = data
        # 修改队尾指针
        self.rear = (self.rear + 1) % self.max

    def delete(self):
        """
        出队
        :return: 返回队首元素
        """
        # 队空
        if self.isEmpty():
            raise IndexError('队列为空')
        # 获队首元素
        data = self.data[self.front]
        # 修改队首指针
        self.front = (self.front + 1) % self.max
        #返回
        return data

    def peak(self):
        """
        获取队首元素
        :return: 队首元素
        """
        # 队空
        if self.isEmpty():
            raise IndexError('队列为空')
        # 返回队首元素
        return self.data[self.front]


if __name__ == '__main__':

    print('PyCharm')
    # 11.循环队列
    cseqQueue = CSeqQueue(5)
    # 入队
    cseqQueue.enter(10)
    cseqQueue.enter(20)
    cseqQueue.enter(30)
    print('输出队首元素:', cseqQueue.peak())
    # 出队10
    data = cseqQueue.delete()
    print('出队的元素:', data)
    print('队首元素:', cseqQueue.peak())
    # 出队20
    data = cseqQueue.delete()
    print('出队的元素:', data)
    print('队首元素:', cseqQueue.peak())
    # 入队
    cseqQueue.enter(40)
    cseqQueue.enter(50)
    cseqQueue.enter(60)
    print('队首元素:', cseqQueue.peak())

链式队列的实现

  • 结点设置:与单链表一致,包括数据域data与指针域next。
  • 链式队列示意图
    在这里插入图片描述
  • 代码实现
class Node:
    """
    定义链式队列结点
    """
    def __init__(self, data):
        # 数据域
        self.data = data
        # 指针域
        self.next = None

链式队列的初始化

  • 初始化
    def __init__(self):
        """
        链式队列初始化
        """
        # 队首结点指向None
        self.front = Node(None)
        # 队尾指针指向队首
        self.rear = self.front
  • 是否为空
    def isEmpty(self):
        """
        判断是否为空
        :return: true or false
        """
        return self.front == self.rear

入队

  • 核心思想
    • 队尾的next指针指向新结点
    • 队尾指针指向新结点
  • 入队示意图
    在这里插入图片描述
  • 代码实现
    def enter(self, data):
        """
        入队
        :param data: 入队元素值
        """
        # 创建新结点
        newNode = Node(data)
        self.rear.next = newNode
        self.rear = newNode

出队

  • 核心思想
    • 检查队列是否为空
    • 保留队首结点
    • 将队首结点的next指针指向队首结点的后继结点,实现删除
  • 出队示意图
    在这里插入图片描述
  • 代码实现
    def delete(self):
        """
        出队
        :return: 出队值
        """
        # 队列为空
        if self.isEmpty():
            raise IndexError('队列为空')
        else:
            node = self.front.next
            # 队首结点的next指向队首结点的后继结点
            self.front.next = node.next
            # 返回出队结点
            return node

获取队首元素

    def peak(self):
        """
        获取队首元素
        :return: 队首元素
        """
        # 队列为空
        if self.isEmpty():
            raise IndexError('队列为空')
        else:
            # 返回队首元素
            return self.front.next.data

链式队列总代码与调试

# 链式队列
class Node:
    """
    定义链式队列结点
    """
    def __init__(self, data):
        # 数据域
        self.data = data
        # 指针域
        self.next = None

class LinkedQueue:
    """
    链式队列定义
    """
    def __init__(self):
        """
        链式队列初始化
        """
        # 队首结点指向None
        self.front = Node(None)
        # 队尾指针指向队首
        self.rear = self.front

    def isEmpty(self):
        """
        判断是否为空
        :return: true or false
        """
        return self.front == self.rear

    def enter(self, data):
        """
        入队
        :param data: 入队元素值
        """
        # 创建新结点
        newNode = Node(data)
        self.rear.next = newNode
        self.rear = newNode

    def delete(self):
        """
        出队
        :return: 出队值
        """
        # 队列为空
        if self.isEmpty():
            raise IndexError('队列为空')
        else:
            node = self.front.next
            # 队首结点的next指向队首结点的后继结点
            self.front.next = node.next
            # 返回出队结点
            return node

    def peak(self):
        """
        获取队首元素
        :return: 队首元素
        """
        # 队列为空
        if self.isEmpty():
            raise IndexError('队列为空')
        else:
            # 返回队首元素
            return self.front.next.data


if __name__ == '__main__':

    print('PyCharm')
    # 12.链式队列
    linkedQueue = LinkedQueue()
    # 入队
    linkedQueue.enter('A')
    linkedQueue.enter('B')
    linkedQueue.enter('C')
    print('输出队首元素:', linkedQueue.peak())
    # 出队
    node = linkedQueue.delete()
    print('出队元素:', node.data)
    node = linkedQueue.delete()
    print('出队元素:', node.data)
    print('输出队首元素:', linkedQueue.peak())

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

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

相关文章

颜色归一化操作

当我们不太关注图像具体细节,只关注图像大致的内容时,为了避免光照角度、光照强度对图像的影响,可以采用下面进行归一化操作。这种颜色系统具有通道对表面方向、照明方向具有鲁棒性的特性,适用于图像分割等领域,在机器…

深度学习处理文本(6)

理解词嵌入 重要的是,进行one-hot编码时,你做了一个与特征工程有关的决策。你向模型中注入了有关特征空间结构的基本假设。这个假设是:你所编码的不同词元之间是相互独立的。事实上,one-hot向量之间都是相互正交的。对于单词而言…

STL-vector的使用

1.STL-vector 向量是可以改变其大小的线性序列容器。向量使用连续的空间存储元素,表明向量可以像数组通过下标来访问元素,但是向量的大小可以动态变化。向量的容量可能大于其元素需要的实际容量,向量通过消耗更多的内存来换取存储管理效率。…

MySQL深入

体系结构 连接层:主要处理客户端的连接进行授权认证、校验权限等相关操作 服务层:如sql的接口、解析、优化在这里完成,所有跨存储引擎的操作在这里完成 引擎层:索引是在存储引擎层实现的,所以不同的存储引擎他的索引…

Genspark:重新定义搜索体验的AI智能体引擎

关于我们 飞书-华彬智融知识库 由前百度高管景鲲(Eric Jing)和朱凯华(Kay Zhu)联合创立的AI搜索引擎Genspark,正以革命性的技术架构和用户导向的设计理念,为全球用户带来一场搜索体验的范式革命。本文将基…

从零实现Json-Rpc框架】- 项目实现 - 服务端主题实现及整体封装

📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…

AI助力PPT制作,让演示变得轻松高效

AI助力PPT制作,让演示变得轻松高效!随着科技的进步,AI技术早已渗透到各行各业,特别是在办公领域,AI制作PPT已不再是未来的梦想,而是现实的工具。以前你可能需要花费数小时来制作一个完美的PPT,如…

React-01React创建第一个项目(npm install -g create-react-app)

1. React特点 JSX是javaScript语法的扩展,React开发不一定使用JSX。单向响应的数据流,React实现单向数据流,减少重复代码,比传统数据绑定更简单。等等 JSX是js的语法扩展,允许在js中编写类似HTML的代码 const …

C++学习笔记之内存管理

仅用于记录学习理解 选择题答案及解析 globalVar:C(数据段 (静态区)) 解析:全局变量存放在数据段(静态区),生命周期从程序开始到结束,程序运行期间一直存在。 staticGlobalVar&…

【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法

增删改查操作 接下来,我们来实现一下用户的增加、删除和修改的操作。 增( Insert ) UserInfoMapper接口: 我们写好UserInfoMapper接口后,自动生成 XML 代码; UserInfoMapper.xml实现: 增删改查方法命名规范 如果我们…

使用Python构建Kafka示例项目

新建项目 mkdir python-kafka-test cd python-kafka-test 安装依赖 pip install confluent_kafka 创建配置文件 # Kafka配置文件# Kafka服务器配置 KAFKA_CONFIG {bootstrap.servers: localhost:9092,# 生产者特定配置producer: {client.id: python-kafka-producer,acks:…

本地化部署DeepSeek-R1蒸馏大模型:基于飞桨PaddleNLP 3.0的实战指南

目录 一、飞桨框架3.0:大模型推理新范式的开启1.1 自动并行机制革新:解放多卡推理1.2 推理-训练统一设计:一套代码全流程复用 二、本地部署DeepSeek-R1-Distill-Llama-8B的实战流程2.1 机器环境说明2.2 模型与推理脚本准备2.3 启动 Docker 容…

VBA 64位API声明语句第008讲

跟我学VBA,我这里专注VBA, 授人以渔。我98年开始,从源码接触VBA已经20余年了,随着年龄的增长,越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友,都来学习VBA,利用VBA,起码可以提高…

Linux信号——信号的保存(2)

关于core和term两种终止方式 core是什么? 将进程在内存中的核心数据(与调试有关)转存到磁盘中形成core,core.pid的文件。 core dump:核心转储。 core与term的区别: term只是普通的终止,而core终止方式还要…

【蓝桥杯嵌入式——学习笔记一】2016年第七届省赛真题重难点解析记录,闭坑指南(文末附完整代码)

在读题过程中发现本次使用的是串口2,需要配置串口2。 但在查看产品手册时发现PA14同时也是SWCLK。 所以在使用串口2时需要拔下跳线帽去连接CH340。 可能是用到串口2的缘故,在烧录时发现报了一个错误。这时我们要想烧录得按着复位键去点击烧录&#xff0c…

基础常问 (概念、代码)

读源码 代码题 Void方法 ,也可以提前rerun;结束 RandomAccessFile类(随机访问文件) 在 Java 中,可以使用RandomAccessFile类来实现文件指针操作。RandomAccessFile提供了对文件内容的随机访问功能,它的文件指针可以通…

J1 ResNet-50算法实战与解析

🍨 本文為🔗365天深度學習訓練營 中的學習紀錄博客🍖 原作者:K同学啊 | 接輔導、項目定制 一、理论知识储备 1. 残差网络的由来 ResNet主要解决了CNN在深度加深时的退化问题(梯度消失与梯度爆炸)。 虽然B…

[MySQL初阶]MySQL(8)索引机制:下

标题:[MySQL初阶]MySQL(8)索引机制:下 水墨不写bug 文章目录 四、从问题到底层,从现象到本质1.为什么插入的数据默认排好序2.MySQL的Page(1)为什么选择用Page?(2&#x…

Muduo网络库实现 [九] - EventLoopThread模块

目录 设计思路 类的设计 模块的实现 私有接口 公有接口 设计思路 我们说过一个EventLoop要绑定一个线程,未来该EventLoop所管理的所有的连接的操作都需要在这个EventLoop绑定的线程中进行,所以我们该如何实现将EventLoop和线程绑定呢?…

《K230 从熟悉到...》识别机器码(AprilTag)

《K230 从熟悉到...》识别机器码(aprirltag) tag id 《庐山派 K230 从熟悉到...》 识别机器码(AprilTag) AprilTag是一种基于二维码的视觉标记系统,最早是由麻省理工学院(MIT)在2008年开发的。A…