基于PyQt5的图形化界面开发——队列动画演示

news2024/12/27 13:26:20

目录

  • 0. 前言
  • 1. 了解队列
  • 2. 代码实现
  • 3. 效果演示
  • 其他PyQt5文章

0. 前言

本文使用PyQt5制作图形化界面演示数据结构中的队列操作,与上一节队列动画相对应
基于PyQt5的图形化界面开发——队列动画演示

操作系统:Windows10 专业版

开发环境:Pycahrm Comunity 2022.3

Python解释器版本:Python3.8

第三方库:PyQt5

1. 了解队列

队列(Queue)是一种常用的数据结构,类似于现实生活中的排队,是一种先进先出(First In,First Out)的数据结构,即最先进入队列的元素最先出队。

队列具有以下几个基本操作:

  • enqueue: 入队,将一个元素添加到队尾
  • dequeue: 出队,从队头移除一个元素,并返回这个元素的值
  • front: 队头,获取队头的元素值,但不将其移除
  • is_empty: 判断队列是否为空

队列可以使用数组或链表来实现。使用数组实现队列需要考虑到如何动态扩容,而链表实现则需要注意在队尾进行操作,否则操作的时间复杂度将变为 O(n)。

队列在很多场景中都得到了广泛应用,比如现实中的排队、计算机中的进程调度、网络中的数据传输等等。例如,当你使用计算机浏览网页时,网络数据被保存在队列中,一个请求还没有处理完毕时,其他的请求需要等待它前面的请求先完成,这就是队列的应用之一。

例如:
生活中排队买票是队列的一个常见例子。

假设你要去银行柜台排队取钱,如果前面没有人,你就可以直接到柜台取钱,而如果前面有人,你就必须排队等待。

如果你排在排队的最后,那么你需要等待所有其他人先取完钱后才能取钱,即先进入排队的人先取完钱后才轮到你。这就是队列的先进先出原则,即最先进入队列的元素最先出队。

这种情形也常用在电影院和公共汽车站中。在电影院中,你需要排队买票,然后按照先进先出的原则依次进入电影院;在公共汽车站中,你需要排队等车,车到后按照先进先出的原则上车。

在计算机中,进程调度和消息队列也应用了队列的先进先出原则。例如,当计算机向一个进程发送多个消息时,该进程会按照先进先出的原则依次处理每一个消息,这就是队列的应用之一。

堆栈特性为后进先出,也叫LIFO(Last In First Out);那么队列的特性与之对应为先进先出,又叫FIFO(First In First Out)。

2. 代码实现

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys


class Node:
    def __init__(self, data):
        self.data = data
        self.next = None


class Queue:
    def __init__(self):
        self.head = None
        self.tail = None

    def enqueue(self, data):
        new_node = Node(data)
        if self.tail is None:
            self.head = new_node
            self.tail = new_node
        else:
            self.tail.next = new_node
            self.tail = new_node

    def dequeue(self):
        if self.head is not None:
            data = self.head.data
            self.head = self.head.next
            if self.head is None:
                self.tail = None
            return data
        else:
            return None

    def front(self):
        if self.head is not None:
            return self.head.data
        else:
            return None

    def is_empty(self):
        return self.head is None

    def display(self, scene):
        pen = QPen(QColor(0, 255, 0))
        font = QFont("Arial", 10)
        y = 100
        current_node = self.head
        while current_node is not None:
            # Draw node rectangle
            scene.addRect(50, y, 50, 50, pen)
            # Draw node text
            text = scene.addText(str(current_node.data), font)
            text.setDefaultTextColor(QColor(255, 255, 255))
            text.setPos(70, y + 10)
            current_node = current_node.next
            y += 70


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Queue Demo")
        self.setFixedSize(500, 500)

        self.scene = QGraphicsScene(self)
        self.view = QGraphicsView(self.scene, self)
        self.view.setGeometry(0, 0, 500, 500)

        self.queue = Queue()
        self.queue.enqueue(10)
        self.queue.enqueue(20)
        self.queue.enqueue(30)

        self.queue.display(self.scene)

        # Add UI elements
        enqueue_button = QPushButton("Enqueue", self)
        enqueue_button.move(10, 10)
        enqueue_button.clicked.connect(self.handle_enqueue)

        dequeue_button = QPushButton("Dequeue", self)
        dequeue_button.move(10, 40)
        dequeue_button.clicked.connect(self.handle_dequeue)

        front_button = QPushButton("Front", self)
        front_button.move(10, 70)
        front_button.clicked.connect(self.handle_front)

        clear_button = QPushButton("Clear", self)
        clear_button.move(10, 100)
        clear_button.clicked.connect(self.handle_clear)

        self.data_edit = QLineEdit(self)
        self.data_edit.move(100, 10)

    def handle_enqueue(self):
        data = self.data_edit.text()
        if data != "":
            self.queue.enqueue(data)
            self.scene.clear()
            self.queue.display(self.scene)

    def handle_dequeue(self):
        data = self.queue.dequeue()
        if data is not None:
            QMessageBox.information(self, "Dequeue", "Dequeued value: " + str(data))
            self.scene.clear()
            self.queue.display(self.scene)
        else:
            QMessageBox.warning(self, "Dequeue", "Queue is empty")

    def handle_front(self):
        data = self.queue.front()
        if data is not None:
            QMessageBox.information(self, "Front", "Front value: " + str(data))
        else:
            QMessageBox.warning(self, "Front", "Queue is empty")

    def handle_clear(self):
        self.queue = Queue()
        self.scene.clear()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

3. 效果演示

还是初始化后存有三个元素,你可以使用最后一个按钮Clear给它清空
在这里插入图片描述

清空了所有元素:
在这里插入图片描述
然后入队两个元素,分别是1和2:
在这里插入图片描述

现在我们进行队首元素查询,这个操作不应该让元素出队,并且应该遵循先进先出的原则,应该查询到1,演示效果的确如此:
在这里插入图片描述

现在出队两次,那么就又回到了初始的转态,即空队,现在再进行出队会怎么样呢?

收到了提示队列为空:
在这里插入图片描述

其他PyQt5文章

基于PyQt5的图形化界面开发——自制MQTT客户端

基于PyQt5的图形化界面开发——Windows内存资源监视助手[附带编译exe教程]

基于PyQt5的图形化界面开发——模拟医院管理系统

基于PyQt5的图形化界面开发——自制ssh工具

基于PyQt5的图形化界面开发——PyQt示例_计算器

基于PyQt5的图形化界面开发——PyQt示例_扫雷

基于PyQt5的图形化界面开发——自制Redis图形化客户端(文末附源码)

基于PyQt5的图形化界面开发——堆栈动画演示

基于PyQt5的图形化界面开发——队列动画演示

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

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

相关文章

javascript基础十六:Ajax 原理是什么?如何实现?

一、是什么 AJAX全称(Async Javascript and XML) 即异步的JavaScript 和XML,是一种创建交互式网页应用的网页开发技术,可以在不重新加载整个网页的情况下,与服务器交换数据,并且更新部分网页 Ajax的原理简单来说通过XmlHttpRequ…

Linux编辑器,开机重启,用户注销,用户管理 常用命令

Linux 实操篇- Vi 和Vim 编辑器 vi 和vim 的基本介绍 Linux 系统会内置vi 文本编辑器 Vim 具有程序编辑的能力,可以看做是Vi 的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特…

环境感知算法——4.RandLA-Net基于SemanticKITTI训练

1.前言 RandLA-Net(Random Sampling and Local Feature Aggregator Network)是一种处理点云数据的神经网络结构,采用随机采样(Random Sampling, RS)以降低点云密度并减少计算量。尽管随机采样可能会丢掉一些有用的信息…

【 STM32实例 】 智能小车的红外循迹

文章目录 前言一、硬件选择与连接1. STM32F103C8T6最小系统板2. L298N双路电机驱动3. 红外循迹模块 二、环境配置1. Device2. Output3. C/C4. Debug 三、项目管理与代码实现1. 项目结构2. 工程管理3. 具体文件xunji.cxunji.hmain.c 总结项目源码 前言 这篇文章我主要讲的是让基…

chatgpt赋能python:Python加颜色代码-提高代码可读性和吸引力的简单技巧

Python加颜色代码 - 提高代码可读性和吸引力的简单技巧 在编写Python代码时,您可能已经注意到,有时候需要强调某些部分,以使其更易于阅读和理解。这时候,您可以使用加颜色代码来增强代码的可读性和吸引力。在本文中,我…

Opencv项目实战:基于dlib的人脸关键点检测

文章目录 一、项目简介二、环境配置2.1、dlib人脸检测器:dlib.get_frontal_face_detector()2.2、dlib关键点定位工具:shape_predictor_68_face_landmarks.dat 三、项目实战 一、项目简介 该项目基于dlib模块提供的人脸检测器以及关键点定位工具完成。首…

大数据:hive数据库的操作语法,数据表,内部表,external外部表,数据导入导出load,insert

大数据: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学&#x…

chatgpt赋能python:关于Python中打开文件的语句详解

关于Python中打开文件的语句详解 在Python中,打开文件是一项常见的任务,可以用于读写文件和进行日志记录。本文将介绍Python中打开文件的语句,并提供一些实用技巧,以便方便地管理文件。 为什么需要打开文件? 在计算…

【动态规划】通配符匹配与正则表达式匹配

文章目录 一、通配符匹配1.1 思路分析1.2 初始化处理1.3 代码1.4 优化 二、正则表达式匹配2.1 思路分析2.2 初始化设置2.3 代码 一、通配符匹配 题目描述: 给你一个输入字符串 (s) 和一个字符模式 ,请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符…

如何在Github上免费部署网站

如何在Github上免费部署静态网站 背景一、新建仓库(github账号的需要注册)二、下载仓库三、将内容上传到远程仓库里四、启动Page服务 背景 部署网站需要服务器,但是如果你只是部署静态网站就可以蹭Github上的免费服务器。因为发现现在的过程…

基于springboot+Redis的前后端分离项目(一)-【黑马点评】

🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码:eh11 基于session和redis实现登录 (一)前言(二)导入资源(三)短信…

Spring数据库事务处理

数据库事务的基本知识 ACID 两类丢失更新 事务回滚丢失更新: 目前大部分数据库已经通过锁的机制来避免了事务回滚丢失更新。 数据库锁的机制: 锁可以分为乐观锁和悲观锁,而悲观锁又分为:读锁(共享锁)和写锁(排它锁),…

chatgpt赋能python:使用Python制作动画的步骤和工具

使用Python制作动画的步骤和工具 Python不仅是一种流行的编程语言,还可以用于制作动画。本文将介绍一些基本步骤和工具,帮助你制作出精美的动画作品。 步骤一:选择一个好的动画框架 Python有很多强大的动画框架可以使用。其中一些最受欢迎…

chatgpt赋能python:Python删除目录下文件:介绍和方法

Python删除目录下文件:介绍和方法 在日常的开发和运维工作中,我们可能会需要删除某个目录下的一些文件。使用Python的好处在于其强大的处理能力和简单易用的语法。本文将介绍Python删除目录下文件的方法,并提供一些实用的代码示例。 使用os…

java-数组和方法

java-数组和方法 一、数组 1.1 概念 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。 1.2 定义格式 第一种 数据类型 [] 数组名 例: int[] arr; double[] arr; char[] arr;第二种 数据类型 数组名[] 例: int arr[]; doubl…

交流有功功率、无功功率、视在功率计算

交流有功功率、无功功率、视在功率计算 1、有功功率2、无功功率3、视在功率4、功率因数5、总结 1、有功功率 有功功率:在交流电路中,每个瞬时的有功功率是不同的,且不断变化,一般用平均有功功率(一个周期内功率的平均…

黑盒测试用例设计练习题

1、准考证号码 对招干考试系统“输入学生成绩”子模块设计测试用例。招干考试分三个专业,准考证号第一位为专业代号,如: 1-行政专业, 2-法律专业, 3-财经专业。 行政专业准考证号码为:110001~111215 法律专…

chatgpt赋能python:Python数据清洗:如何剔除异常值

Python 数据清洗:如何剔除异常值 随着数据量的持续增长,数据清洗已经成为了数据分析中不可或缺的一个步骤。数据清洗的目的是去除错误、缺失或不必要的数据,从而使数据更加准确、可靠、一致和完整。本文将讲解如何使用 Python 编程语言来剔除…

【C++ 程序设计】第 2 章:面向对象的基本概念

目录 一、结构化程序设计 二、面向对象程序设计的概念和特点 (1)面向对象程序设计的概念 (2)面向对象程序设计的特点 三、类的初步知识 (1)类的定义 (2)类的定义示例 四、类…

Three.js--》实现3d踢球模型展示

目录 项目搭建 初始化three.js基础代码 设置环境纹理加载模型 使用Cannon-es实现物理世界 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本…