Python数据结构实验 队列的实现

news2024/11/18 18:23:13

一、实验目的

1.掌握用Python定义队列的顺序存储结构和链式存储结构,以便在实际背景下灵活运用;

2.掌握队列的特点,即先进先出的原则;

3.掌握队列的基本操作实现方法。

二、实验环境

1.Windows操作系统的计算机

2.Python3.7环境平台和PyCharm编辑器

三、实验说明 

1.实现队列的顺序存储结构和链式存储结构的基本操作。

2.注意队满、队空条件及入队、出队时的指针的改变。
3.实验中如无特别说明,均要求使用脚本(.py)方式编写代码。

4.自主编写程序,必要时参考相关资料。

5.实验学时:2学时

四、实验内容和步骤

1.实验内容

(1) 基础实验题

设计整数循环队列和整数链队的基本运算程序,并用相关数据进行测试。

参考框架:

#整数循环队列

class CSqQueue:               #循环队列类

    def __init__(self):                                   #构造方法

  

    def empty(self):                     #判断队列是否为空

        

    def push(self,e):                     #元素e进队

        

    def pop(self):         #出队元素

        

    def gethead(self):         #取队头元素

        

if __name__ == '__main__':

    print()

    print("  创建空循环队列qu")

                   _   

    print("  qu:","空" if qu.empty() else "不空")

    print("  进队1-4")

                   _   

                   _   

                   _   

                   _   

    print("  qu:","空" if qu.empty() else "不空")

    print("  出队顺序:",end=' ')

    while not qu.empty():

                          _     

    print()

    print("  qu:","空" if qu.empty() else "不空")        

print()

#整数链队

class LinkNode:                                            #链队结点类

    def __init__(self,data=None):                  #构造方法

class LinkQueue:        #链队类

    def __init__(self):                                    #构造方法

        

    def empty(self):  #判断队是否为空

        

    def push(self,e):              #元素e进队

    def pop(self):  #出队操作

    def gethead(self):                          #取队顶元素操作

if __name__ == '__main__':

    print()

    print("  创建空链队qu")

                       _   

    print("  qu:","空" if qu.empty() else "不空")

    print("  进队1-4")

                       _   

                       _   

                       _   

                       _   

    print("  qu:","空" if qu.empty() else "不空")

    print("  出队顺序:",end=' ')

    while not qu.empty():

                              _     

    print()

    print("  qu:","空" if qu.empty() else "不空")        

    print()

(2) 应用实验题

分别采用循环队列和链队实现杨辉三角形的输出。杨辉三角形的特点是两个腰上的数字都为1,其他位置上的数字是其上一行中与之相邻(上部和左上部)的两个整数之和。例如,当n=5时,打印的杨辉三角形如下:

1

1    1

1    2    1

1    3    3    1

1    4    6    4    1

参考框架:

from CSqQueue import CSqQueue

from LinkQueue import LinkQueue

from LinkQueue import LinkQueue

def yang_hui_CQ(n):                     #采用循环队列

    line = CSqQueue ()

    line.push(1)                       # 第 1行的 1个数入队

    for i in range(1, n+1):         # 输出三角形的前 n 行

                       _   

        for j in range(1, i + 1):     #对于i行j列的元素

            ……

        line.push(1)       # 上面的循环只生成了i+1行的前i个数,最后一个数1入队

        print()                    # 换行

def yang_hui_LQ(n):                     #采用链队

    line = LinkQueue()

    line.push(1)                    # 第 1行的 1个数入队

    for i in range(1, n+1):         # 输出三角形的前 n 行

                       _   

        for j in range(1, i + 1):     #对于i行j列的元素

            ……

        line.push(1)       # 上面的循环只生成了i+1行的前i个数,最后一个数1入队

        print()                    # 换行

if __name__ == "__main__":

    yang_hui_CQ(7)

    print()

yang_hui_LQ(7)

2.实验步骤

(1)分析实验内容,写出程序大致框架或完整的程序代码。

(2)进入Python集成环境。

(3)编辑程序并进行保存。

(4)运行程序,若有错误,修改错误后再次运行,如此反复进行到不显示出错为止。

(5)检查程序输出结果。

五、实验代码与结果(程序运行代码及其结果)

1. (1)给出算法的基本设计思想。

  (2)根据设计思想,采用Python语言描述算法,关键之处给出注释。

class CSqQueue:         #循环队列类

    def __init__(self, maxsize):    #构造方法

        self.maxsize = maxsize

        self.queue = [None] * maxsize

        self.head = 0

        self.tail = 0



    def empty(self):            #判断队列是否为空

        return self.head == self.tail



    def push(self, e):       #元素e进队

        if (self.tail + 1) % self.maxsize == self.head:

            print("Queue is full!")

            return False

        self.queue[self.tail] = e

        self.tail = (self.tail + 1) % self.maxsize

        return True



    def pop(self):        #出队元素

        if self.empty():

            print("Queue is empty!")

            return None

        e = self.queue[self.head]

        self.head = (self.head + 1) % self.maxsize

        return e



    def gethead(self):      #取队头元素

        if self.empty():

            print("队列为空")

            return None

        return self.queue[self.head]



if __name__ == '__main__':

    qu = CSqQueue(5)

    print("创建空循环队列qu")

    print("qu:","空" if qu.empty() else "不空")

    print("进队1-4")

    qu.push(1)

    qu.push(2)

    qu.push(3)

    qu.push(4)

    print("qu:","空" if qu.empty() else "不空")

    print("出队顺序:",end=' ')

    while not qu.empty():

        print(qu.pop(), end=" ")

    print()

    print("qu:","空" if qu.empty() else "不空")



class LinkNode:        #链队结点类

    def __init__(self, data=None):   #构造方法

        self.data = data

        self.next = None



class LinkQueue:    #链队类

    def __init__(self): #构造方法

        self.head = None

        self.tail = None



    def empty(self):      #判断队是否为空

        return self.head is None



    def push(self, e):  #元素e进队

        node = LinkNode(e)

        if self.tail is None:

            self.head = self.tail = node

        else:

            self.tail.next = node

            self.tail = node



    def pop(self):  #出队操作

        if self.empty():

            print("队列为空")

            return None

        e = self.head.data

        self.head = self.head.next

        if self.head is None:

            self.tail = None

        return e



    def gethead(self):  #取队顶元素操作

        if self.empty():

            print("Queue is empty!")

            return None

        return self.head.data



if __name__ == '__main__':

    qu = LinkQueue()

    print("创建空链队qu")

    print("qu:","空" if qu.empty() else "不空")

    print("进队1-4")

    qu.push(1)

    qu.push(2)

    qu.push(3)

    qu.push(4)

    print("qu:","空" if qu.empty() else "不空")

    print("出队顺序:",end=' ')

    while not qu.empty():

        print(qu.pop(), end=" ")

    print()

    print("qu:","空" if qu.empty() else "不空")


2. (1)给出算法的基本设计思想。

  (2)根据设计思想,采用Python语言描述算法,关键之处给出注释。

from CSqQueue import CSqQueue

from LinkQueue import LinkQueue



def yang_hui_CQ(n):

    """采用循环队列实现杨辉三角形的输出"""

    line = CSqQueue(20)  # 创建一个长度为20的循环队列,可根据数据规模自行调整

    line.push(1)  # 第一行的1入队

    for i in range(n):

        for j in range(i):  # 每行输出i个数

            e1 = line.pop()  # 出队上方元素

            if j == 0:  # 第一个元素不需要加法

                e2 = 0

            else:

                e2 = line.gethead()  # 获取左上方元素,不出队

            e3 = e1 + e2  # 计算当前元素的值

            print(e3, end=" ")

            line.push(e3)  # 当前元素入队

        line.push(1)  # 行末元素入队

        print()  # 换行输出



def yang_hui_LQ(n):

    """采用链队实现杨辉三角形的输出"""

    line = LinkQueue()  # 创建一个空链队

    line.push(1)  # 第一行的1入队

    for i in range(n):

        for j in range(i):  # 每行输出i个数

            e1 = line.pop()  # 出队上方元素

            if j == 0:  # 第一个元素不需要加法

                e2 = 0

            else:

                e2 = line.gethead()  # 获取左上方元素,不出队

            e3 = e1 + e2  # 计算当前元素的值

            print(e3, end=" ")

            line.push(e3)  # 当前元素入队

        line.push(1)  # 行末元素入队

        print()  # 换行输出



if __name__ == "__main__":

    print("循环队列杨辉三角:")

    yang_hui_CQ(3)

    print()

    print("链队杨辉三角:")

    yang_hui_LQ(3)

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

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

相关文章

BufferedInputStream详解

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯&am…

javase day10笔记

第十天课堂笔记 debug调试★★★ 步骤: 设置断点 - > 启动调试debug -> 单步运行 -> 观察参数 单步跳过f8: 向下执行语句,不进入方法内部单步跳入f7: 进入方法内部执行单步跳出shift f8: 跳出当前方法,到方法调用处跳转到光标所在的位置alt f9: 变量整合 变量 …

【力扣hot100】1. 两数之和 49.字母异位词分组 128. 最长连续序列

目录 1. 两数之和题目描述做题思路参考代码 49.字母异位词分组题目描述做题思路参考代码 128. 最长连续序列题目描述做题思路参考代码 1. 两数之和 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数…

亚马逊云科技《生成式 AI 精英速成计划》

最近亚马逊云科技推出了「生成式AI精英速成计划」,获取包含:免费学习热门生成式AI课程、技能证书、人力主管的面试辅导、云计算国际认证、免费去往北美参加全球用户大会等~ 针对开发者和企业非技术专业人士,了解如何使用大模型平台…

【机器学习之---统计】统计学基础概念

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 统计学基础 1. 频率派 频率学派(传统学派)认为样本信息来自总体,通过对样本信息的研究可以合理地推断和估计总体信息…

怎么拆解台式电脑风扇CPU风扇的拆卸步骤-怎么挑

今天我就跟大家分享一下如何选购电脑风扇的知识。 我也会解释一下机箱散热风扇一般用多少转。 如果它恰好解决了您现在面临的问题,请不要忘记关注本站并立即开始! 文章目录列表:大家一般机箱散热风扇都用多少转? 机箱散热风扇选择…

PieCloudDB Database 3.0 正式发布丨数仓虚拟化流转数据要素

3月14日,拓数派 2024 年度战略暨新产品发布会在上海国际会议中心成功举行。本次大会的主题为「数仓虚拟化 流转数据要素」,吸引了众多业内资深专家和合作伙伴参与,共同探讨数据要素流转和数字技术创新等热门话题。 拓数派创始人兼 CEO 冯雷&…

40 openlayers setCenter 之后 绘制了Overlay 地图定位异常

前言 这是之前在 生产环境碰到的一个问题 这个其实就是 业务上一个地图点击点位展示详情, 然后再点击另外一个点位 展示详情, 切换中心店的这个过程 其主要的问题是 使用 openlayers 的 Map.View.setCenter() 了之后, 整个地图的中心点切换到了一个莫名其妙的地方 然后 经…

Occupancy 训练策略

损失函数 Dice Loss Dice Loss 是一种用于图像分割的损失函数,其灵感来自于Dice 系数,是一种衡量两个样本相似度的方法。Dice 系数定义为: Dice 系数 2 * TP / (2 * TP FP FN) 其中: TP:预测为正且真实值为正的像…

深入理解MySQL中的JOIN算法

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 一、引言二、嵌套循环连接(Nested-Loop Join)2.1 工作原理2.2 性能考虑2.3 优化策略 三、块嵌套循环…

云原生(五)、Docker-Swarm集群

基础环境说明 1、环境准备 1、启动4台服务器(在同一个网段内)。 2、重命名4台服务器,方便区分。 hostnamectl set-hostname swarm1 reboot安装docker。参考文章:云原生(二)、Docker基础 2、DockerSwarm…

STM32---DHT11温湿度传感器与BH1750FVI光照传感器(HAL库、含源码)

写在前面:本节我们学习使用两个常见的传感器模块,分别为DHT11温湿度传感器以及BH1750FVI光照传感器,这两种传感器在对于环境监测中具有十分重要的作用,因为其使用简单方便,所以经常被用于STM32的项目之中。今天将使用分享给大家&a…

C# WPF编程-事件

C# WPF编程-路由事件 路由事件概要路由事件的三种方式 WPF事件WPF最重要的5类事件:生命周期事件 鼠标事件键盘事件多点触控输入原始触控 路由事件概要 路由事件是具有更强传播能力的事件,它们可在元素树中向上冒泡和向下隧道传播,并沿着传播…

【测试开发学习历程】认识Python + 安装Python

1 认识 Python 人生苦短,我用 Python —— Life is short, I use Python 1.1 Python 的起源 Python 的创始人为吉多范罗苏姆(Guido van Rossum),江湖人称“龟叔” 1989 年的圣诞节期间,吉多范罗苏姆为了在荷兰首都阿姆…

查看文件内容的指令:cat,tac,nl,more,less,head,tail,写入文件:echo

目录 cat 介绍 输入重定向 选项 -b -n -s tac 介绍 输入重定向 nl 介绍 示例 more 介绍 选项 less 介绍 搜索文本 选项 head 介绍 示例 选项 -n tail 介绍 示例 选项 echo 介绍 输出重定向 追加重定向 cat 介绍 将标准输入(键盘输入)的内容打…

鸿蒙Harmony应用开发—ArkTS-LazyForEach:数据懒加载

LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当在滚动容器中使用了LazyForEach,框架会根据滚动容器可视区域按需创建组件,当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用。 接口…

Day45:WEB攻防-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件

目录 PHP-MYSQL-二次注入-DEMO&74CMS DEMO-用户注册登录修改密码 CMS-74CMS个人中心简历功能 PHP-MYSQL-堆叠注入-DEMO&CTF强网 Demo 2019强网杯-随便注(CTF题型) PHP-MYSQL-带外注入-DEMO&DNSLOG(让服务器主动把数据交出去) 知识点&…

Docker入门到实践之环境配置

Docker入门到实践之环境配置 docker 环境安装 Ubuntu/Debian: sudo apt update sudo apt install docker.ioCentOS/RHEL: sudo yum install dockerArch Linux: sudo pacman -S docker如果未安装成功,或者env的path未设置成功,运行时会报错 Bash: Do…

国自然提交状态,NSFC已审核 ≠ 申请书被受理!!!

本 期 推 荐 【SciencePub学术】2024年度国家自然科学基金集中受理期项目申请受理工作已基本结束。到底什么状态才算申请书被NSFC接收成功呢? 01 申请书状态 申请人登录ISIS系统,至此,绝大部分申请人的系统状态为下面三种: …

Stable Diffusion实现光影字效果

昨天下午有人在群里发光影图片,大家都觉得很酷,我没怎么在意。直到早上我在小红书看到有人发同款图片,只是一晚上的时间点赞就超过了8000,而且评论数也很高,也可以做文字定制变现。研究了一下发现这个效果不难实现&…