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

news2024/12/22 19:15:51

目录

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

0. 前言

本文使用 PyQt5制作图形化界面演示数据结构中的堆栈操作

操作系统:Windows10 专业版

开发环境:Pycahrm Comunity 2022.3

Python解释器版本:Python3.8

第三方库:PyQt5

1. 了解堆栈

在计算机科学中,堆栈(Stack),也常被称为栈,是一种抽象的数据结构,它是一种只能从一个端添加元素和删除元素的线性数据结构。这一端被称为“栈顶”,相对地,把另一端称为“栈底”。根据这个定义,可以推断出后进先出(LIFO,Last In First Out)这个特性。

堆栈有以下几个基本操作:

  • push: 将一个元素添加到栈顶
  • pop: 从栈顶移除一个元素,并返回这个元素的值
  • peek/top: 返回栈顶的元素值,但不将其移除
  • is_empty: 返回栈是否为空

堆栈通常使用数组或链表实现。如果使用数组实现,需要考虑动态扩容的情况。如果使用链表实现,需要注意在链表头进行操作,否则操作的时间复杂度将变为O(n)。

堆栈通常用作典型的临时存储(例如在递归函数中存储函数的返回地址),或者是需要逆序输出元素的应用程序那么在这样的应用中,堆栈的弹出顺序就可以实现逆序的要求。

例如:
假设你要洗堆满了碗,你会把碗一层一层地往上堆放。当你洗完一个碗放入放碗柜时,你把刚才放在最上层的碗取下来,这就是一个栈的操作过程。

当你需要使用碗时,你从栈顶拿下一个碗。如果你拿下的碗与你想要使用的碗不一样,你就把拿下的碗再放回去,这样使用的就是最后一个放上去的碗。这个过程叫做“后进先出”,或者LIFO(Last 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. 演示效果

提供了四个操作:

  • 入栈
  • 出栈
  • 栈顶元素查询
  • 堆栈初始化(清空)

运行代码可以看到堆栈中是有三个元素(绿色框框)在其中,这是我们在代码中提前预设的三个值
在这里插入图片描述
现在输入13,然后将它Push到栈中,可以看到 多了一个元素:
在这里插入图片描述

然后取其Peek(顶端)的值,看看是否如愿:
在这里插入图片描述
如我们压入栈中的一样,就是13,但是并不会将它从栈中取出

现在我们将其Pop,看看会是怎样的情形:
在这里插入图片描述
在这里插入图片描述
执行完Pop操作后,将栈顶元素13取出,并且栈中也少了一个元素

其他PyQt5文章

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

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

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

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

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

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

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

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

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

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

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

相关文章

图文并茂教你快速入门React系列03-事件

事件 使用 React 可以在 JSX 中添加 事件处理函数。其中事件处理函数为自定义函数,它将在响应交互(如点击、悬停、表单输入框获得焦点等)时触发。 事件处理 // 这样写:export default function Button() {function handleClic…

chatgpt赋能python:Python删除文件的方法与注意事项

Python删除文件的方法与注意事项 在Python中,删除文件是很常见的操作。通常,我们需要在程序中删除不再需要的文件,或者在清理本地存储空间时删除缓存文件。本文将重点介绍Python如何删除文件以及可能涉及到的注意事项。 如何删除文件 Pyth…

redis设计原理009持久化策略

目录 RDB 备份原理 优点 缺点 AOF 不能保证绝对不丢失数据 重写 流程 结论 优点 缺点 如何选择RDB和AOF 同时开启 混合模式 运行过程 数据 数据恢复 优点 缺点 优化方案 总结 RDB 通过快照(snapshotting)完成的,当符合一定…

写一个python文件,在shell脚本中运行

最近要复现论文了,发现代码的主函数在.py文件中,运行脚本是在.sh中。 要命的事,我不懂,我怎么debug。 1.新建一个pycharm项目,新建main.py import argparsedef get_args():parser argparse.ArgumentParser()parser…

chatgpt赋能python:Python模块的优势和局限性

Python模块的优势和局限性 引言 Python作为一门高级编程语言,被广泛应用于各种领域。其中,Python内置的模块系统,为Python在编程中的灵活性和可扩展性提供了很大的优势。在本文中,我们将探讨Python模块的优势和局限性及其对Web优…

chatgpt赋能python:用Python剔除重复内容提升SEO效果

用Python剔除重复内容提升SEO效果 SEO是指通过优化网站结构和内容,在搜索引擎中获得更高的排名,从而提升网站流量和曝光度的一种网络营销方式。网站内容是SEO工作的重要组成部分,而剔除重复的内容对于SEO效果的提升有着重要的作用。本文将介…

chatgpt赋能python:Python制作人机交互界面:完美融合技术和用户体验

Python 制作人机交互界面:完美融合技术和用户体验 随着人工智能和互联网技术的发展,人机交互一直是非常热门的话题。Python 作为一门功能强大,应用广泛的高级编程语言,同样在这个领域发挥了重要作用。Python 制作人机交互界面&am…

【列表迭代器和增强for循环】

列表迭代器和增强for循环 1.列表迭代器 ListIterator:列表迭代器 通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器…

SAP ABAP smartforms 创建并实现调用源码(下)

SAP ABAP smartforms 创建并实现调用源码(上) smartforms 入门详见上一篇博文。 一:报表程序调用 smartforms 示例:报表选中一行,将这行机相关数据通过表单打印出来。实际例子:采购订单表,销售订单。 调…

低代码平台iVX

一、ivx是啥 编写复杂的代码仍然是一项具有挑战性的任务。然而,现在有一种令人振奋的解决方案出现了——iVX,这是一种创新的可视化编程语言,为每个人提供快速掌握的能力。 iVX 是一个 “零代码” 的可视化编程语言,“零代码” 是…

基于flask的web应用开发——认识@app.route

目录 0. 前言1. flask简介2. 编写你的第一个网页3. 运行效果查看4. 本节小结 0. 前言 本专栏以基于flask实现web前端,即制作一个自己的网页 本节学习路由装饰器app.route() 操作系统:Windows10 专业版 开发环境:Pycahrm Comunity 2022.3 …

chatgpt赋能python:Python加R:让数据科学更加高效

Python加R:让数据科学更加高效 在过去的几年里,Python和R成为数据科学领域中最受欢迎的编程语言。它们提供了丰富的库和工具,帮助从事数据分析和机器学习的人们更加高效地完成任务。然而,Python和R都有其各自的优缺点。 Python的…

代理IP基础、实际运用,以及如何获取

代理IP是指通过一个中间服务器来转发用户的网络请求,从而在网络上隐藏用户的真实IP地址,或者绕过网络限制以达到访问特定内容的目的。下面是代理IP的一些基础知识: 1、代理IP的分类:代理IP可以分为普匿代理IP、透明代理IP和高匿代…

互联网医院牌照申请的资料以及流程

随着互联网的发展,互联网医院逐渐成为一个热门话题,越来越多的医疗机构开始尝试在互联网上提供医疗服务。然而,想要在互联网上开展医疗服务,必须获得互联网医院牌照。本文将介绍互联网医院牌照申请需要的资料、条件,以…

算法提高-搜索-DFS之剪枝与优化

DFS之剪枝与优化 DFS之剪枝与优化AcWing 165. 小猫爬山AcWing 166. 数独AcWing 167. 木棒AcWing 168. 生日蛋糕 DFS之剪枝与优化 AcWing 165. 小猫爬山 DFS的五种剪枝方法 (1)优化搜索顺序 (2)排除等效冗余 (3&#…

chatgpt赋能python:Python删除目录:如何在项目中正确删除文件夹?

Python 删除目录:如何在项目中正确删除文件夹? 在使用Python语言进行程序开发的过程中,可能会需要删除不再需要的目录,例如缓存和日志文件夹。然而,删除目录需要小心谨慎,避免误删除重要文件或目录。在本文…

chatgpt赋能python:Python列表自动排序

Python列表自动排序 Python是一种流行的编程语言,它有很多有用的内置函数和数据结构。其中一个最常用的数据结构是列表。在Python中,列表是一个有序的集合,可以存储多种类型的元素。列表不仅仅是一个数据结构,它还有一些有用的方…

Flink standalone 集群会话模式部署搭建

环境准备 1、Centos7集群环境搭建 2、flink-1.17.0-bin-scala_2.12.tgz 安装包,下载地址 规划 服务器角色iphadoop01JobManager TaskManager192.168.140.132hadoop02TaskManager192.168.140.133hadoop03TaskManager192.168.140.134 安装 1、下载 flink-1.17.0-…

【Unity3D】边缘检测特效

1 边缘检测原理 边缘检测的原理是:检测每个像素周围的像素亮度差,如果亮度差异较大,就将该像素识别为边缘,并进行边缘着色。 使用过卷积神经网络(CNN)的读者,一定知道卷积运算,笔者之…

储能基础知识【一】

储能基础知识【一】 1、基础名词、概念、对应的英文单词、系统组成2、储能电池系统组成图3、性能指标 1、基础名词、概念、对应的英文单词、系统组成 电池储能系统(Battery Energy Storage System, BESS);电芯(Battery Cell&…