当前位置: 首页 > news >正文

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

目录标题

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

队列的定义

  • 定义:队列(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.dtcms.com/a/109681.html

相关文章:

  • 在Vue中如何高效管理组件状态
  • Swift 继承
  • Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
  • FreeRtos简介
  • LLM架构解析:词嵌入模型 Word Embeddings(第二部分)—— 从基础原理到实践应用的深度探索
  • vscode 使用ssh进行远程开发 (remote-ssh)
  • 【2】搭建k8s集群系列(二进制)之安装etcd数据库集群
  • MySQL学习笔记集--DML
  • 【北京化工大学】 神经网络与深度学习 实验6 MATAR图像分类
  • JeecgBoot AI 应用开发平台,AIGC 功能介绍
  • MCP服务器搜索引擎有哪些?MCP资源网站推荐
  • IdeaVim-AceJump
  • 【Mysql】之存储引擎详解
  • 【UVM学习笔记】更加灵活的UVM—通信
  • oracle asm 相关命令和查询视图
  • 本地部署爆款传输神器 FastSend 并实现外部访问
  • 智能巡检机器人在化工企业的应用研究
  • 针对 Python 3.7.0,以下是 Selenium 版本的兼容性建议和安装步骤
  • MTK-GMS版本国内WIFI受限问题
  • Fatal error compiling: 无效的目标发行版: 17 -> [Help 1]的解决方法
  • c++ (通用引用)和(左值引用)区别
  • 自适应信号处理任务(过滤,预测,重建,分类)
  • MAUI开发第一个app的需求解析:登录+版本更新,用于喂给AI
  • qRegisterMetaType函数使用
  • 泛微ECOLOGY9 解决文档中打开发票类PDF文件无内容的配置方法
  • Python Cookbook-5.2 不区分大小写对字符串列表排序
  • flux文生图部署笔记
  • unet结构, 为什么要下采样, 上采样?
  • Docker安装开源项目x-ui详细图文教程
  • 【一步步开发AI运动APP】六、运动计时计数能调用